home *** CD-ROM | disk | FTP | other *** search
/ Retro Gamer 15 / Retro Gamer 15.iso / MSX Emulators / blueMSXv160.exe / Contrib / cbios / src / cb_main.a80 < prev    next >
Text File  |  2003-08-13  |  75KB  |  3,651 lines

  1. ; C-BIOS ver 0.17
  2. ;
  3. ; Copyright (c) 2002-2003 BouKiCHi.  All rights reserved.
  4. ; Copyright (c) 2003 Reikan.  All rights reserved.
  5. ;
  6. ; Redistribution and use in source and binary forms, with or without
  7. ; modification, are permitted provided that the following conditions
  8. ; are met:
  9. ; 1. Redistributions of source code must retain the above copyright
  10. ;    notice, this list of conditions and the following disclaimer.
  11. ; 2. Redistributions in binary form must reproduce the above copyright
  12. ;    notice, this list of conditions and the following disclaimer in the
  13. ;    documentation and/or other materials provided with the distribution.
  14. ;
  15. ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  16. ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  17. ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  18. ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  19. ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  20. ; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  21. ; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  22. ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  23. ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  24. ; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. ;
  26. ;
  27. ; [date]
  28. ; 2002-08-07 start development.
  29. ; 2002-08-09 it's my birthday,this version was playable games.
  30. ; 2002-08-13 added fonts and key input routine,displayed infomation.
  31. ;
  32. ; 2002-08-15 improved cartridge knowledge.
  33. ; 2002-08-19 added DCOMPR function and adjusted wait.
  34. ; 2002-08-20 added initilize table of $fcc2-$fcc4
  35. ;            added in_joy and in_trig
  36. ;            filesize reduced from 32KB to 16KB.
  37. ;         set.bat can be restoring for only 32kb readable emulators. 
  38. ; 2002-08-21 name of this project was changed.
  39. ; 2002-08-24 added INITGRP,CHGMOD and sound_init.
  40. ; 2002-08-26 added initialize value of GRP??? and MLT???.
  41. ;            re-adjust memory ack function.
  42. ;            added calling H.STKE function.
  43. ;            re-adjust routines.
  44. ; 2002-08-27 added sound mode.
  45. ;            syntax adjust for other assemblers.
  46. ;            fixed RDPRIM.
  47. ; 2002-09-08 fixed WRSLT.
  48. ;            added keyboard routine.
  49. ;            added GTSTCK and GTTRIG.
  50. ; 2002-09-10 improved clearing memory routine.
  51. ;            added memory saving trap.
  52. ; 2002-09-11 added print_error function.
  53. ;            added ROM searching and fixed usage of EXPTBL.
  54. ; 2002-09-12 initilize from RG8SAV to RG23
  55. ;            ENASLT returns state of disable interrupt.
  56. ; 2002-09-16 added half of system font.
  57. ; 2002-09-18 added CHPUT routine.
  58. ;            rewrite curs2de and de2curs routine again.
  59. ; 2002-09-19 improved stroke speed of keyboard input.
  60. ;         added scroll routines.
  61. ;         fixed init_grp.
  62. ; 2002-09-22 fixed init_sc5.
  63. ; 2002-09-23 added disk routine.
  64. ; 2002-09-25 rewrite ENASLT.
  65. ;            added init_sc7.
  66. ; 2002-09-26 fixed keyboard routine.
  67. ; 2002-10-02 improved init_sc5.
  68. ; 2003-04-16 divided sound routine from main kernel.
  69. ; 2003-06-01 fixed chgmod related. (init_txt, init_txt32 font load added)
  70. ;            fixed curs2de, de2curs (screen1 support added)
  71. ; 2003-08-10 fixed clear problem in init_txt, init_txt32.
  72. ;            fixed scroll in CHPUT on txt40/graphic1 modes.
  73.  
  74. ;        title "C-BIOS ver 0.17 by BouKiCHi/Reikan"
  75.  
  76. ;---------------------------------------------------
  77. ; I/Oé╞âtâbâNé╠ÆΦï`
  78.  
  79. PRN_STAT        equ $90        ; âvâèâôâ^é╠âXâeü[â^âX
  80. VDP_RP          equ $98        ; VDPâ|ü[âgô╟é▌Åoé╡
  81. VDP_STAT        equ $99        ; VDPâXâeü[â^âXüAâëâbâ`âèâZâbâgüB
  82. PSL_STAT        equ $A8        ; âXâìâbâgâXâeü[â^âX
  83. KBD_STAT        equ $A9        ; âLü[â{ü[âhâXâeü[â^âX
  84. GIO_REGS        equ $AA        ; æììçIOâîâWâXâ^
  85. PPI_REGS        equ $AB        ; PPIâîâWâXâ^
  86.  
  87. PSG_REGS        equ $A0        ; PSGâîâWâXâ^ö╘ìå
  88. PSG_DATA        equ $A1        ; PSGâfü[â^
  89. PSG_STAT        equ $A2        ; PSGâXâeü[â^âX
  90.  
  91.  
  92. MAP_REG1        equ $FC        ; RAMâ}âbâpü[ 0000h-3FFFh
  93. MAP_REG2        equ $FD        ; RAMâ}âbâpü[ 4000h-7FFFh
  94. MAP_REG3        equ $FE        ; RAMâ}âbâpü[ 8000h-BFFFh
  95. MAP_REG4        equ $FF        ; RAMâ}âbâpü[ C000h-FFFFh
  96.  
  97. VDP_DATA        equ $98        ; VDPâfü[â^Åæé½ì₧é▌
  98. VDP_ADDR        equ $99        ; VDPâAâhâîâX
  99. VDP_PALT        equ $9A        ; VDPâpâîâbâgâëâbâ`
  100. VDP_REGS        equ $9B        ; VDPâîâWâXâ^âAâNâZâX
  101.  
  102. H_KEYI          equ $FD9A      ; âLü[â{ü[âhèäéΦì₧é▌âtâbâN
  103. H_TIMI          equ $FD9F      ; â^âCâ}ü[èäéΦì₧é▌âtâbâN
  104. H_NMI           equ $FDD6      ; NMIâtâbâN
  105. H_STKE          equ $FEDA      ; âXâ^âbâNâGâëü[âtâbâN
  106.  
  107. STKTOP          equ $F674
  108.  
  109. EXP_TBL         equ $FCC1      ; âXâìâbâgÅεò±âeü[âuâï
  110. SLT_TBL         equ $FCC5      ; âXâìâbâgÅεò±
  111.  
  112. EXBRSA          equ $FAF8      ; âTâuâìâÇê╩Æu
  113. SSL_REGS        equ $FFFF      ; ègÆúâXâìâbâgæIæ≡âîâWâXâ^
  114.  
  115. ;----------------------------------------------
  116. ; âÅü[âNâGâèâA
  117.  
  118. GRPNAM          equ $F3C7      ; Screen2 Name
  119. GRPCOL          equ $F3C9      ; Screen2 Color
  120. GRPCGP          equ $F3CB      ; Screen2 CG pattern
  121. GRPATR          equ $F3CD      ; Screen2 Attribute
  122. GRPPAT          equ $F3CF      ; Screen2 Sprite pattern
  123.  
  124. TXTNAM          equ $F3B3
  125. TXTCOL          equ $F3B5
  126. TXTCGP          equ $F3B7
  127. TXTATR          equ $F3B9
  128. TXTPAT          equ $F3BB
  129.  
  130. T32NAM          equ $F3BD
  131. T32COL          equ $F3BF
  132. T32CGP          equ $F3C1
  133. T32ATR          equ $F3C3
  134. T32PAT          equ $F3C5
  135.  
  136.  
  137. NAMBAS          equ $F922
  138. CGPBAS          equ $F924
  139. PATBAS          equ $F926
  140. ATRBAS          equ $F928
  141.  
  142. MLTNAM          equ $F3D2      ; Screen3 Name
  143. MLTCOL          equ $F3D4      ; Screen3 Color
  144. MLTCGP          equ $F3D6      ; Screen3 CG pattern
  145. MLTATR          equ $F3D8      ; Screen3 Attribute
  146. MLTPAT          equ $F3DA      ; Screen3 Sprite pattern
  147.  
  148. CLIKSW          equ $F3DB      ; Key Click.
  149.  
  150. STATFL          equ $F3E7
  151. RG0SAV          equ $F3DF
  152. RG1SAV          equ $F3E0
  153.  
  154. RG4SAV          equ $F3E3
  155.  
  156. RG8SAV          equ $FFE7
  157.  
  158. CLIKFL          equ $FBD9
  159. OLDKEY          equ $FBDA
  160. NEWKEY          equ $FBE5
  161. KEYBUF          equ $FBF0
  162.  
  163. PUTPNT          equ $F3F8      ; âLü[âoâbâtâ@é╓é╠â|âCâôâ^
  164. GETPNT          equ $F3FA      ; âLü[âoâbâtâ@é╓é╠â|âCâôâ^
  165. LIMPNT          equ $FC17      ; âLü[âoâbâtâ@é╓é╠â|âCâôâ^
  166.  
  167. BOTTOM          equ $FC48
  168. HIMEM           equ $FC4A
  169.  
  170. JIFFY           equ $FC9E      ; â^âCâ}ü[âJâEâôâ^
  171. SCRMOD          equ $FCAF
  172.  
  173.  
  174. FORCLR          equ $F3E9
  175. BAKCLR          equ $F3EA
  176. BDRCLR          equ $F3EB
  177.  
  178. PSG_DBG         equ $F3EC      ; âfâoâbâOùpâtâëâO
  179.  
  180. CSRY            equ $F3DC      ; âJü[â\ü[âïê╩Æu(Yì└òW)
  181. CSRX            equ $F3DD      ; âJü[â\ü[âïê╩Æu(Xì└òW)
  182.  
  183. LINL40          equ $F3AE
  184. LINL32          equ $F3AF
  185. LINLEN          equ $F3B0      ; ìsÉö.
  186. CRTCNT          equ $F3B1      ; ëµû╩é╠îàÉö
  187.  
  188. LINWRK          equ $FC18      ; 40îàò¬é╠âoâbâtâ@
  189.  
  190. ESCCNT          equ $FCA7      ; ESCùpâJâEâôâ^.
  191.  
  192. ;-----------------
  193. ; âfâoâbâOâïü[â`âôùpâüâéâè
  194. ;-----------------
  195.  
  196. DISPADDR        equ $E010   ; â_âôâvâAâhâîâXùpâüâéâè
  197. LASTSTAC        equ $E000
  198. SP_REGS         equ $E002 
  199.  
  200. ;---------------------
  201. ; âWâââôâvâeü[âuâï
  202. ;---------------------
  203.  
  204. ;start
  205. Start 
  206.         code
  207. ;0000h CHKRAM
  208. chkram
  209.         org     $0000
  210.         di
  211.         jp      soft_reset
  212.  
  213. ;âtâHâôâgé╓é╠â|âCâôâ^
  214.  
  215.         org     $0004
  216.         dw      B_Font
  217.  
  218.         org     $0006
  219.  
  220. rdvdpa  db      VDP_DATA ; VDPô╟é▌Åoé╡â|ü[âg
  221. wrvdpa  db      VDP_DATA ; VDPÅæé½ì₧é▌â|ü[âg
  222.  
  223. ;0008h SYNCHR
  224. synchr
  225.         org     $0008
  226.         ret
  227.  
  228. ;000Ch RDSLT    öCê╙âXâìâbâgé⌐éτé╠âüâéâèô╟é▌ì₧é▌
  229.  
  230.         org     $000c
  231.         jp      rdslt
  232.  
  233. chrgtb
  234.         org     $0010
  235.         ret
  236.  
  237. ;0014h WRSLT    öCê╙âXâìâbâgé╓é╠âüâéâèÅæé½ì₧é▌
  238.         org     $0014
  239.         jp      wrslt
  240.         ret
  241. ;0018h OUTDO
  242.         org     $0018
  243.         jp      ch_put
  244. ;001Ch CALSLT    âCâôâ^ü[âXâìâbâgâRü[âïâïü[â`âô
  245. calslt
  246.         org     $001c
  247.         jp      cal_slt
  248.         ret
  249.  
  250. ;0020h DCOMPR    HLé╞DEé╠öΣèr
  251. dcompr  org     $0020
  252.         jp      wordcomp
  253.         ret
  254.  
  255. ;0024h ENASLT    âXâìâbâgé╠ò╧ìX
  256.  
  257.         org     $0024
  258.         jp      enaslt
  259.  
  260. ;0028h MATH-PACK
  261.         org     $0028
  262.         ret
  263.  
  264. ;002D âoü[âWâçâôIDôÖ
  265. romid
  266.         org     $002d
  267. ; version ID
  268.         db      0 ; 0 .. msx1 ,1 .. msx2
  269.         db      0 ; ??
  270.         db      0 ; ??
  271.  
  272. ;0030h CALLF    âCâôâ^ü[âXâìâbâgî─é╤Åoé╡(RST30hö┼)
  273.         org     $0030
  274.         jp      call_lf
  275.  
  276. ;0038h INT_38    èäéΦì₧é▌âïü[â`âô(RST38,VBlank,Timer...) 
  277.         org     $0038
  278.         jp      int_start
  279.  
  280. ;0038h INITIO    I/Oé╠Åëè·ë╗
  281.         org     $003b
  282.         ret
  283.  
  284. ;0041h DISSCR    âXâNâèü[âôé≡ò\Īé│é╣é╚éóüB
  285.         org     $0041
  286.         jp      disscr
  287. ;0044h ENASCR    âXâNâèü[âôé≡ò\Īé│é╣éΘüB
  288.         org     $0044
  289.         jp      enascr
  290. ;---------------
  291. ;VDPâïü[â`âô
  292. ;---------------
  293. ;0047h WRTVDP
  294.         org     $0047
  295.         jp    wrt_vdp
  296. ;004Ah RDVRM
  297.     org    $004a
  298.     jp    rd_vrm
  299. ;004Dh WRTVRM
  300.         org    $004d
  301.         jp      wrt_vrm
  302.  
  303.  
  304. ;0050h SETRD
  305.         org     $0050
  306.         jp      vdp_setrd
  307.  
  308. ;0053h SETWRT  .. VRAMÅæé½ì₧é▌âAâhâîâXé╠É▌ÆΦ  
  309.         org     $0053
  310.         jp      vdp_setwrt
  311.  
  312.         org     $0056
  313.         jp      vdp_fillmem
  314.         org     $0059
  315.         jp      vdp_ldirmv   ; VRAM -> Memory
  316.         org     $005C
  317.         jp      vdp_data_rep ; Memory -> VRAM
  318.  
  319. ;005Fh VDPâXâNâèü[âôâéü[âhé╠ò╧ìX
  320.        org      $005f
  321.        jp       chgmod
  322.                 
  323. ;0062h  CHGCLR
  324.        org      $0062
  325.        jp       chgclr
  326.         
  327.  
  328. ;0066h INT_NMI .. NMIèäéΦì₧é▌
  329.         org     $0066
  330.         jp      nmi_int
  331.  
  332. ;0069h CLRSPR  .. âXâvâëâCâgé≡Å┴ïÄüB
  333.  
  334.         org     $0069
  335.         ret
  336.  
  337. ;006Ch INITXT    ëµû╩é≡TEXT1âéü[âhé╔Åëè·ë╗üB
  338.     org    $006C
  339.     jp    init_txt
  340.  
  341. ;006Fh INIT32    ëµû╩é≡GRAPHIC1âéü[âhé╔Åëè·ë╗üB
  342.     org    $006F
  343.     jp    init_txt32
  344.  
  345. ;0072h INITGRP    ëµû╩é≡GRAPHIC2âéü[âhé╔Åëè·ë╗üB
  346.  
  347.         org     $0072
  348.         jp      init_grp
  349.  
  350. ;007Eh  SETGRP
  351.         org     $007E
  352.         jp      set_grp
  353.  
  354. ;0085h DOLINE    âëâCâôò`ëµ
  355. doline
  356.         org     $0085
  357.         ret
  358. ;0089h GRPPRT    basic?
  359. grpprt
  360.         org     $0089
  361.         ret
  362.  
  363.         org     $008a
  364.         ret
  365. ;
  366. ;0090h GICINI    ë╣î╣ICé╠Åëè·ë╗
  367.         org     $0090
  368.         jp      sound_init
  369.         org     $0093
  370.         jp      sound_out
  371.         org     $0096
  372.         jp      sound_stat
  373.  
  374. ;009Ch CHSNS  .. âLü[âoâbâtâ@é╠â`âFâbâN
  375.  
  376.         org     $009c
  377.         jp      ch_sns
  378.  
  379. ;009Fh CHGET .. âLü[âoâbâtâ@é⌐éτâfü[â^é≡ô╛éΘ
  380.  
  381.         org     $009f
  382.         jp      ch_get
  383.  
  384. ;00A2h  CHPUT .. âfâBâXâvâîâCé╠âLâââëâNâ^é≡Åoù═é╖éΘüB
  385.  
  386.         org     $00a2
  387.         jp      ch_put
  388.  
  389. ;00C6h  POSIT .. âJü[â\âïê┌ô«üB
  390.     org     $00c6
  391.     jp    curxy
  392.  
  393. ;00D5h GTSTCK .. âWâçâCâXâeâBâbâNÅεò±é≡ô╛éΘüB
  394.  
  395.         org     $00d5
  396.         jp      in_joy
  397.  
  398. ;00D8h GTTRIG .. âgâèâKü[Åεò±é≡ô╛éΘüB
  399.  
  400.         org     $00d8
  401.         jp      in_trig
  402.  
  403. ;012Dh WRTVDP .. VDPâîâWâXâ^é╠Ælé≡ò╧ìXé╖éΘ
  404.  
  405.         org     $012d
  406.         ret
  407.  
  408. ;0131h VDPSTA .. VDPâXâeü[â^âXé≡ô╟é▌Åoé╖
  409. ;vdpsta
  410.         org     $0131
  411.         ret
  412.  
  413.  
  414. ;chgsnd
  415.         org     $0135
  416.         ret
  417.  
  418. ;0138h RDSLTREG âvâëâCâ}âèâXâìâbâgé╠Åεò±é≡ô╟é▌Åoé╖
  419. ;g_slotreg
  420.         org     $0138
  421.         jp      get_slotreg
  422.  
  423. ;013Bh WRSLTREG âvâëâCâ}âèâXâìâbâgé╔Åεò±é≡Åæé½ì₧é▐üB
  424. ;s_slotreg
  425.         org     $013B
  426.         jp      set_slotreg
  427.  
  428. ;013Eh RDVDP    VDPâXâeü[â^âXé╠ô╟é▌Åoé╡
  429.         org     $013E
  430.         jp      vdp_stat_in
  431.  
  432. ;setpag  org    $013d
  433. ;        ret
  434.  
  435. ;0141h SNSMAT    âLü[â}âgâèâNâXé≡ô╛éΘ
  436. ;snsmat
  437.         org     $0141
  438.         jp      in_keyboard
  439.  
  440. ;phydio
  441.         org     $0144
  442.         ret
  443.  
  444. ;0145h RSTPLT
  445. ;rstplt
  446.         org     $0145
  447.         ret
  448.  
  449. ;0149h RSTPLT?
  450. ;rstplt
  451.         org     $0149
  452.         ret
  453.  
  454. ;getplt
  455.         org     $014d
  456.         ret
  457.  
  458. ;0156h KILBUF    âLü[â{ü[âhâoâbâtâ@é≡âNâèâAé╖éΘ
  459.         org     $0156
  460.         jp      kilbuf
  461.  
  462. ;0159h CALBAS    âxü[âVâbâNâCâôâ^âvâèâ^é≡î─é╤Åoé╖üB
  463.         org     $0159
  464.         jp      call_basic_intr
  465.  
  466. ;beep
  467.         org     $017d
  468.         ret
  469.  
  470. ;prompt
  471.         org     $0181
  472.         ret
  473.  
  474. ;newpad
  475.         org     $01ad
  476.         ret
  477.  
  478. ;chgmdp
  479.         org     $01b5
  480.         ret
  481.  
  482. ;knjprt
  483.         org     $01bd
  484.         ret
  485.  
  486. ;redclk
  487.         org     $01f5
  488.         ret
  489.  
  490. ;wrtclk
  491.         org     $01f9
  492.         ret
  493.  
  494. ; -------------------
  495. ; âXâ^ü[âgâAâbâvâRü[âhüiâèâZâbâgÄ₧é╔î─é╤Åoé│éΩéΘüj
  496. ; -------------------
  497.  
  498.         org     $0200
  499. soft_reset
  500. ;âfâoâbâOùp
  501. ;        ex     (sp),hl
  502. ;        ld     (LASTSTAC),hl
  503. ;
  504. ;        ld     hl,$0000
  505. ;        add    hl,sp
  506. ;        ld     (SP_REGS),hl
  507. ;
  508. ;        ld     hl,$f300
  509.  
  510. ; âCâôâ^ü[âtâFü[âXé≡Åëè·ë╗é╖éΘüB
  511.         ld      a,$82
  512.         out     (PPI_REGS),a
  513.         ld      a,$50
  514.         out     (GIO_REGS),a
  515.  
  516. ;âüâéâèâoâôâNé≡Åëè·ë╗é╖éΘüB
  517.  
  518.         xor     a,a
  519. ;        out    (MAP_REG1),a
  520.         inc     a
  521.         out     (MAP_REG2),a
  522.         inc     a
  523.         out     (MAP_REG3),a
  524.         inc     a
  525.         out     (MAP_REG4),a
  526.  
  527. ;âüâéâèâ`âFâbâNüAæIæ≡âXâìâbâgé≡âüâéâèé╔Åæé½ì₧é▐üB
  528. ; C = âvâëâCâ}âè,B = âZâJâôâ_âèüB
  529.  
  530.         ld      bc,$0303
  531. chk_wrt_ram               ; âyü[âWéRé╠RAMé≡â`âFâbâNé╖éΘüB
  532.         in      a,(PSL_STAT)
  533.         and     a,$3F
  534.         ld      e,a
  535.  
  536.         ld      a,c
  537.         and     a,$03
  538.         rrca
  539.         rrca
  540.         or      a,e     
  541.         out     (PSL_STAT),a ; A = BBxxxxxx
  542.  
  543.         ld      a,(SSL_REGS)
  544.         cpl
  545.         and     a,$3F
  546.         ld      e,a
  547.  
  548.         ld      a,b
  549.         and     a,$03
  550.         rrca
  551.         rrca
  552.         or      a,e
  553.         ld      (SSL_REGS),a ; A = EExxxxxx 
  554.         ld      e,a
  555.  
  556.         ld      a,$12
  557.         ld      ($c010),a
  558.         ld      a,($c010)
  559.         cp      a,$12
  560.         jr      nz,cant_wrt
  561.         jp      ram_ok
  562. cant_wrt
  563.         dec     b
  564.         jp      p,chk_wrt_ram
  565.         ld      b,$03
  566.         dec     c
  567.         jp      p,chk_wrt_ram
  568.         ld      de,str_memory_err
  569.         jp      print_error
  570.  
  571. ram_ok
  572.         ld      hl,SLT_TBL
  573.         ld      b,0
  574.         ld      c,a
  575.         add     hl,bc
  576.  
  577.         ld      a,e
  578.         ld      (hl),a        ;ègÆúâXâìâbâg
  579.  
  580.         and     a,$0C
  581.  
  582.         in      a,(PSL_STAT)
  583.         and     a,$03
  584.         or      a,$80
  585.         ld      (EXP_TBL),a    ;MAIN-ROMé╠ê╩Æu
  586.         and     a,$80
  587.         ld      (EXP_TBL+1),a
  588.         ld      (EXP_TBL+2),a
  589.         ld      (EXP_TBL+3),a
  590.  
  591. ; you can write the memory.
  592.  
  593.  
  594. ;----------------------
  595. ;âåü[âUü[âCâôâ^ü[âtâFü[âX
  596. ;----------------------
  597.  
  598.  
  599.         ld      hl,$f300
  600.         ld      sp,hl        ; âXâ^âbâNé≡$f300é╔üB
  601.  
  602.         call    init_ram
  603.  
  604.         call    check_rom
  605.  
  606. ;        in      a,(PSL_STAT)
  607. ;        ld      ($F000),a
  608. ;        call    p3_chk
  609.  
  610.         call    init_vdp
  611.  
  612.         xor     a,a
  613.         ld      (PSG_DBG),a
  614.  
  615.         call    sound_init
  616.  
  617.         ei
  618.  
  619.         call    disp_info
  620.         call    start_cartprog
  621.  
  622. ;----------------------
  623. ;âJü[âgâèâbâWé≡Ä└ìsé╖éΘ
  624. ;----------------------
  625.  
  626. start_game
  627.         in      a,(PSL_STAT)
  628.         rrca
  629.         rrca
  630.         and     a,$03
  631.         cp      a,$03
  632.         jr      z,dont_chgscr
  633.         ld      a,$01
  634.         call    chgmod
  635. dont_chgscr
  636.         ld      hl,stack_error
  637.         push    hl
  638.         ld      a,($4000)
  639.         cp      a,'A'
  640.         jr      nz,p3_run
  641.         ld    hl,($4002)    ; âJü[âgâèâbâWèJÄnâAâhâîâXüB
  642.         jr      prg_jumper
  643. p3_run
  644.         ld      hl,($8002)      ; âJü[âgâèâbâWèJÄnâAâhâîâXüB
  645. prg_jumper
  646.         jp    (hl)        ; Ä└ìs...
  647.  
  648.  
  649. ;-------------------------------
  650. ; Åεò±ò\Ī
  651. ;-------------------------------
  652. disp_info
  653.  
  654. ; âVâtâgâLü[é¬ëƒé│éΩé─éóéΩé╬debug_modeé╓üB
  655. ;
  656.         ld      a,$06
  657.         call    in_keyboard
  658.         bit     0,a
  659.         jp      z,debug_mode
  660.  
  661.  
  662. ; âvâìâOâëâÇÅεò±é╠ò\Ī
  663.  
  664.         ld      hl,str_proginfo   ; HL = ò╢ÄÜù±âAâhâîâX
  665.         call    prn_text
  666.  
  667.         
  668.         ld      a,($4000)
  669.         cp      a,'A'
  670.         ret     z
  671.         ld      a,($8000)
  672.         cp      a,'A'
  673.         ret     z
  674.  
  675.         ld      hl,str_nocart
  676.         call    prn_text
  677.  
  678.         jp      hang_up_mode
  679.  
  680.  
  681. ;----------------------------
  682. start_cartprog
  683. ; âXâìâbâgÅπé╔âJü[âgâèâbâWé¬æ╢ì▌é╡é╜é╚éτüA
  684. ; é╗é╠âXâìâbâgé╠âvâìâOâëâÇé≡Ä└ìsé╖éΘüB
  685.  
  686.  
  687.         ld      hl,str_slot
  688.         call    prn_text
  689.  
  690.         call    get_slotreg
  691.         rrca
  692.         rrca
  693.         and     a,$03
  694.  
  695.  
  696.         ld      d,$00
  697.         ld      e,a
  698.         push    de
  699.  
  700.         call    vout_hex8
  701.         call    vout_hyphen
  702.  
  703.         pop     de
  704.         ld      hl,SLT_TBL
  705.         add     hl,de
  706.         ld      a,(hl)
  707.         rrca
  708.         rrca
  709.         and     a,$03
  710.         call    vout_hex8
  711.  
  712. ;âfâoâbâOé╞ô«ì∞â`âFâbâN
  713.  
  714. ;        call    check_sum
  715.  
  716. ;        ld      a,(SMOD_TSTSND)
  717. ;        or      a,a
  718. ;        jr      z,stst_skip
  719.  
  720. ;âTâEâôâhâéü[âhùp
  721. ;        ld      hl,str_canstst
  722. ;        call    prn_text
  723.  
  724. stst_skip
  725.         ld      b,120      ; 2sec wait (1 = 1/60sec)
  726.         call    wait_key07 ; wait routine
  727.  
  728. ;âTâEâôâhâéü[âhùp
  729. ;        bit     7,a
  730. ;        call    z,sound_mode
  731.  
  732.         bit     5,a
  733.         jp      z,sh_keyboard
  734.         bit     0,a
  735.         jp      z,debug_mode
  736.  
  737.         ld      hl,str_crlf
  738.         call    prn_text
  739.  
  740.         ld      hl,str_run
  741.         call    prn_text
  742.  
  743.         call    dbg_reg
  744.  
  745.         ld      b,60       ; 1sec
  746.         call    wait_b
  747.  
  748.         ret
  749.  
  750. ; ------
  751. ; BIOSâfâoâbâOâïü[â`âô
  752. ; ------
  753. ; HL ... NEWKEYé╠âAâhâîâX .
  754. sh_keyboard
  755.         call    init_vdp
  756. kbd_lp
  757.         ld      a,1
  758.         ld      (CSRX),a
  759.         ld      (CSRY),a
  760.         ld      hl,NEWKEY
  761.  
  762.         ld      b,10
  763. kbd_byteread
  764.         push    bc
  765.         ld      a,(hl)
  766.         inc     hl
  767.         ld      b,8
  768. kbd_shift
  769.         rlca
  770.         push    af
  771.         jr      c,kbd_on
  772. ;Bit[n] = 0
  773.         ld      a,'0'
  774.         call    ch_put
  775.         pop     af
  776.         jr      kbd_lpchk
  777. ;Bit[n] = 1
  778. kbd_on
  779.         ld      a,'1'
  780.         call    ch_put
  781.         pop     af
  782. kbd_lpchk
  783.         djnz    kbd_shift
  784.         pop     bc
  785.         ld      a,$0d
  786.         call    ch_put
  787.         ld      a,$0a
  788.         call    ch_put
  789.  
  790.         djnz    kbd_byteread
  791.  
  792.         jp      kbd_lp
  793.  
  794.  
  795. sh_debug
  796.         ex      (sp),hl
  797.         ld      (LASTSTAC),hl
  798.  
  799. debug_mode
  800.         ; âèâ^ü[âôâRü[âhé≡âtâbâNé╔ûäé▀ì₧é▐üB
  801.         ld      a,$C9
  802.         ld      (H_KEYI),a
  803.         ld      (H_TIMI),a
  804.  
  805.         call    init_vdp
  806.  
  807.         ld      a,1
  808.         ld      (CSRX),a
  809.         ld      a,1
  810.         ld      (CSRY),a
  811.  
  812.         ld      hl,$4000    ; âyü[âW1é⌐éτò\Īé╖éΘüB
  813.         ld      (DISPADDR),hl 
  814.  
  815.         ld      ix,(LASTSTAC)
  816.         call    vout_hex16
  817.  
  818.         ld      a,' '
  819.         call    ch_put
  820.  
  821.         ld      ix,(SP_REGS)
  822.         call    vout_hex16
  823. loop_dump
  824.         call    disp_dump
  825.         call    dump_keywait
  826.         jr      loop_dump
  827.  
  828.  
  829. ;-----------------
  830. ; â_âôâvùpâïü[â`âô
  831. ;-----------------
  832.  
  833. disp_dump
  834.  
  835.         ld      a,1
  836.         ld      (CSRX),a
  837.         ld      a,3
  838.         ld      (CSRY),a
  839.  
  840.         ld      ix,(DISPADDR)
  841.         ld      c,$10   ; RegC = rows
  842.  
  843. dump_lp
  844.  
  845.         push    bc
  846.         call    vout_hex16
  847.         pop     bc
  848.         ld      a,':'
  849.         call    ch_put
  850.         ld      b,$10   ; RegB = cols
  851. d16_lp
  852.         ld      a,(ix)
  853.         push    bc
  854.         call    vout_hex8
  855.         pop     bc
  856.         inc     ix
  857.         djnz    d16_lp
  858.  
  859.         dec     c
  860.         jr      nz,dump_lp
  861.  
  862.         ret
  863.  
  864. ;-------------------------
  865. ; âLü[âïü[âvùpâEâFâCâg
  866. dump_keywait
  867.  
  868.         ld      e,$02
  869.  
  870.         ld      a,($E008)
  871.         ld      d,a 
  872.  
  873.         ld      a,$08
  874.         call    in_keyboard
  875.  
  876.         cp      a,d
  877.         jr      z,dumpkey_loop
  878.         ; case of A != E008
  879.         ld      ($E008),a
  880.         ld      e,$10  ; 
  881.  
  882. dumpkey_loop
  883.         halt
  884.         ld      a,($E008)
  885.         ld      d,a 
  886.  
  887.         ld      a,$08
  888.         call    in_keyboard
  889.  
  890.         dec     e
  891.         jr      z,skip_kchk
  892.         cp      a,d
  893.         jr      z,dumpkey_loop
  894.  
  895. skip_kchk
  896.         push    af
  897.         ld      a,$06
  898.         call    in_keyboard
  899.         bit     0,a
  900.         jr      nz,norm
  901.         ld      iy,$1000
  902.         jr      bit_chk
  903. norm
  904.         ld      iy,$100
  905. bit_chk
  906.         pop     af
  907.  
  908.         bit     7,a
  909.         jr      z,on_pagedown
  910.         bit     6,a
  911.         jr      z,on_down
  912.         bit     5,a
  913.         jr      z,on_up
  914.         bit     4,a
  915.         jr      z,on_pageup
  916.  
  917.         ld      ($E008),a
  918.  
  919.         ld      a,$07
  920.         call    in_keyboard
  921.  
  922.         bit     1,a
  923.         jr      z,on_start
  924.  
  925.         jp      dumpkey_loop
  926.  
  927. on_pagedown
  928.         push    iy
  929.         pop     bc
  930.         jr      up_addr
  931. on_pageup
  932.         push    iy
  933.         pop     bc
  934.         jr      down_addr
  935. on_down
  936.         ld      bc,$10
  937.         jr      up_addr
  938. on_up
  939.         ld      bc,$10
  940.         jr      down_addr
  941.  
  942. up_addr
  943.         ld      hl,($E010)
  944.         add     hl,bc
  945.         ld      ($E010),hl
  946.         ret
  947. down_addr
  948.         ld      hl,($E010)
  949.         and     a
  950.         sbc     hl,bc
  951.         ld      ($E010),hl
  952.         ret
  953.  
  954. on_start
  955.         jp      start_game
  956.  
  957.  
  958. ;--------------------
  959. ;VDPâïü[â`âôé╠Åëè·ë╗
  960. ;--------------------
  961.  
  962. init_vdp
  963.         in      a,(VDP_STAT)    ; âëâbâ`é╠Åëè·ë╗
  964.  
  965.         ld      bc,$0000  ; R#0
  966.         call    wrt_vdp
  967.         ld      bc,$7001  ; R#1
  968.         call    wrt_vdp 
  969.         ld      bc,$0002  ; R#2  
  970.         call    wrt_vdp
  971.         ld      bc,$8003  ; R#3
  972.         call    wrt_vdp
  973.         ld      bc,$0104  ; R#4  
  974.         call    wrt_vdp
  975.  
  976.         call    clr_text40
  977.  
  978.         ld      a ,$00
  979.         ld      hl,$0800
  980.         ld      bc,$0800
  981.         call    vdp_fillmem
  982.  
  983. ;                for screen 1 color table
  984.         ld      a ,$F5
  985.         ld      hl,$2000
  986.         ld      bc,$0020
  987.         call    vdp_fillmem
  988.  
  989.  
  990.  
  991. ; PatGenTbl
  992. ;        76543210 76543210
  993. ;        00000100 00000000
  994. ;             04h      00h
  995.  
  996.         ld      bc,$F507  ; R#7
  997.         call    wrt_vdp
  998.  
  999.         in      a,(VDP_STAT)    ;ü@âëâbâ`é╠Åëè·ë╗
  1000.  
  1001.         ld      hl,B_Font
  1002.  
  1003.         ld      de,$800
  1004.         ld      bc,$800
  1005.         call    vdp_data_rep
  1006.  
  1007.  
  1008.         ret
  1009.  
  1010. ;------------------------
  1011. ; ëµû╩ò\Īé│éΩé─éóéΘâeâLâXâgé≡âNâèâAé╖éΘüB
  1012. clr_text40
  1013.         xor     a,a
  1014.         ld      bc,$0400
  1015.         ld      hl,(TXTNAM)
  1016.         call    vdp_fillmem
  1017.         ld      a,1
  1018.         ld      (CSRY),a
  1019.         ld      (CSRX),a
  1020.         ret
  1021.  
  1022. clr_text32
  1023.     xor    a,a
  1024.     ld    bc,$0300
  1025.     ld    hl,(T32NAM)
  1026.     call    vdp_fillmem
  1027.     ld    a,1
  1028.     ld    (CSRY),a
  1029.     ld    (CSRX),a
  1030.     ret
  1031.  
  1032. ;------------------------
  1033. ; RAMé╠Åëè·ë╗
  1034.  
  1035. init_ram
  1036.         
  1037. ; âÅü[âNâGâèâAÅëè·ë╗üB
  1038.  
  1039.         ld      a,$00
  1040.         ld      hl,$F380
  1041.         ld      (hl),a
  1042.         ld      de,$F381
  1043.         ld      bc,$C7D
  1044.     ldir
  1045.  
  1046. ;âèâ^ü[âôâRü[âhûäé▀ì₧é▌
  1047.         ld      a,$C9 ; ret code
  1048.         ld      hl,H_KEYI
  1049.         ld      (hl),a
  1050.         ld      de,H_KEYI+1
  1051.         ld      bc,$024D
  1052.         ldir
  1053.  
  1054. ;âLü[â}âgâèâNâXé╠Åëè·ë╗üB
  1055.         ld      a,$FF 
  1056.         ld      hl,OLDKEY
  1057.         ld      (hl),a
  1058.         ld      de,OLDKEY+1
  1059.         ld      bc,21
  1060.         ldir
  1061.  
  1062. ;âLü[âoâbâtâ@é╠Åëè·ë╗üB
  1063.         ld      a,$00 
  1064.         ld      hl,KEYBUF
  1065.         ld      (hl),a
  1066.         ld      de,KEYBUF+1
  1067.         ld      bc,39
  1068.         ldir
  1069.  
  1070.         ld      a,$00 
  1071.         ld      hl,$FFE7 ; RG8SAV
  1072.         ld      (hl),a
  1073.         ld      de,$FFE7+1
  1074.         ld      bc,15
  1075.         ldir
  1076.  
  1077. ;âAâhâîâXâ|âCâôâ^é≡É▌ÆΦüB
  1078.         ld      hl,KEYBUF
  1079.         ld      (PUTPNT),hl
  1080.         ld      (GETPNT),hl
  1081.  
  1082.         ld      hl,$8000
  1083.         ld      (BOTTOM),hl  ; âyü[âW1,2é═ROMüBâyü[âW3,4é═RAM.  
  1084.  
  1085.         ld      hl,$F380
  1086.         ld      (HIMEM),hl   ;  Ägùpë┬ö\âüâéâèé╠Åπî└
  1087.  
  1088.         ld      (STKTOP),hl  ;  BASICâXâ^âbâNé╠ê╩Æu
  1089.  
  1090.         ld      hl,disk_intr
  1091.         ld      a,$C3
  1092.         ld      (H_STKE),a
  1093.         ld      (H_STKE+1),hl
  1094.  
  1095. ;RDPRIMé≡RAMé╔ô]æùé╖éΘ.
  1096.  
  1097.         ld      hl,m_rdprim
  1098.         ld      de,$F380
  1099.  
  1100.         ld      bc,m_prim_end-m_rdprim
  1101.         ldir
  1102.  
  1103. ; screen 0 âeü[âuâïé╠Åëè·ë╗üB
  1104.     ld    hl,$0000
  1105.     ld    (TXTNAM),hl
  1106.     ld    hl,$0800
  1107.     ld    (TXTCGP),hl
  1108.  
  1109. ; screen 1 âeü[âuâïé╠Åëè·ë╗üB
  1110.         ld      hl,$1800
  1111.         ld      (T32NAM),hl
  1112.         ld      hl,$2000
  1113.         ld      (T32COL),hl
  1114.         ld      hl,$0000
  1115.         ld      (T32CGP),hl
  1116.         ld      hl,$1B00
  1117.         ld      (T32ATR),hl
  1118.         ld      hl,$3800
  1119.         ld      (T32PAT),hl
  1120.  
  1121. ; screen 2 âeü[âuâïé╠Åëè·ë╗
  1122.         ld      hl,$1800
  1123.         ld      (GRPNAM),hl
  1124.         ld      hl,$2000
  1125.         ld      (GRPCOL),hl
  1126.         ld      hl,$0000
  1127.         ld      (GRPCGP),hl
  1128.         ld      hl,$1B00
  1129.         ld      (GRPATR),hl
  1130.         ld      hl,$3800
  1131.         ld      (GRPPAT),hl
  1132.  
  1133. ; screen 3 âeü[âuâïé╠Åëè·ë╗
  1134.         ld      hl,$0800
  1135.         ld      (MLTNAM),hl
  1136.         ld      hl,$0000
  1137.         ld      (MLTCGP),hl
  1138.         ld      hl,$1B00
  1139.         ld      (MLTATR),hl
  1140.         ld      hl,$3800
  1141.         ld      (MLTPAT),hl
  1142.  
  1143. ; é╗é╠æ╝é╠É▌ÆΦüB
  1144.         ld      a,39
  1145.         ld      (LINL40),a
  1146.         ld      a,29
  1147.         ld      (LINL32),a
  1148. ;        ld      a,29
  1149.         ld      a,39
  1150.         ld      (LINLEN),a
  1151.         ld      a,24
  1152.         ld      (CRTCNT),a
  1153.  
  1154.         ld      a,$04
  1155.         ld      (BDRCLR),a
  1156.         ld      (BAKCLR),a
  1157.         ld      a,$0F
  1158.         ld      (FORCLR),a
  1159.  
  1160.         ld      a,$20
  1161.         ld      (RG1SAV),a
  1162.  
  1163.         ld      a,$08
  1164.         ld      (RG8SAV),a
  1165.  
  1166.  
  1167.         ret
  1168.  
  1169. ;----------------------
  1170. ;âTâuâìâÇê╩Æué╠îƒÅo
  1171. chksubpos
  1172.         ld      b,$03
  1173.         ld      hl,$0000
  1174. loop_subpos
  1175.         ld      a,b
  1176.         push    bc
  1177.         call    rdslt
  1178.         pop     bc
  1179.         cp      a,'C'
  1180.         jr      z,chked_c
  1181. slt_wrong
  1182.         djnz    loop_subpos
  1183.         xor     a,a
  1184.         ld      (EXBRSA),a
  1185.         ret
  1186. chked_c
  1187.         inc     hl
  1188.         ld      a,b
  1189.         push    bc
  1190.         call    rdslt
  1191.         pop     bc
  1192.         cp      a,'D'
  1193.         jr      z,chked_d
  1194.         dec     hl
  1195.         jr      slt_wrong
  1196. chked_d
  1197.         ld      a,b
  1198.         ld      (EXBRSA),a
  1199.         ret
  1200.  
  1201. ;------------------------
  1202. ;
  1203. ;âîâWâXâ^é╠ò\Ī
  1204. ;
  1205. dbg_reg
  1206.         push    ix
  1207.         push    iy
  1208.         push    hl
  1209.         push    de
  1210.         push    bc
  1211.         push    af
  1212.  
  1213.         ld      iy,6
  1214.  
  1215.         ld      a,1
  1216.         ld      (CSRX),a
  1217.         ld      a,14
  1218.         ld      (CSRY),a
  1219.  
  1220. dbg_loop
  1221.         pop     ix
  1222.         call    prn_hex
  1223.  
  1224.         dec     iy
  1225.  
  1226.         push    iy
  1227.         pop     bc
  1228.  
  1229.         xor     a,a
  1230.         or      a,c
  1231.  
  1232.         jp      nz,dbg_loop
  1233.         pop     ix
  1234.         push    ix
  1235.         jp      prn_hex ; âîâWâXâ^PCé╠ò\Ī
  1236.  
  1237.  
  1238. ;------------------------
  1239. prn_hex
  1240. ;BC = Reg
  1241.         call    prn_reg
  1242.         call    vout_hex16
  1243.  
  1244.         ld      a,' '
  1245.         call    ch_put
  1246.  
  1247.         ret
  1248.  
  1249. ;------------------------
  1250. prn_reg
  1251. ;
  1252.         push    hl
  1253.         push    bc
  1254.         push    iy
  1255.         pop     bc
  1256.  
  1257.         ld      a,c
  1258.         add     a,a
  1259.         add     a,a
  1260.         ld      c,a
  1261.         
  1262.         ld      hl,reg_tbl
  1263.         add     hl,bc
  1264.  
  1265.         ld      b,3
  1266. reg_lp
  1267.         ld      a,(hl)
  1268.         inc     hl
  1269.         call    ch_put
  1270.         djnz    reg_lp
  1271.  
  1272.         pop     bc
  1273.         pop     hl
  1274.         ret
  1275.  
  1276. ;------------------------
  1277. vout_hex16
  1278. ;16bitò¥é╠16ÉiÉöò\ĪüB
  1279. ;IX = number
  1280. ;dest = BC,HL,AF
  1281.         ; RegBÅπê╩4bit
  1282.         ld      hl,hex_tbl
  1283.         push    ix
  1284.         pop     bc
  1285.  
  1286.         ld      a,b
  1287.         rlca
  1288.         rlca
  1289.         rlca
  1290.         rlca
  1291.         and     a,$0F
  1292.  
  1293.         ld      b,0
  1294.         ld      c,a
  1295.         add     hl,bc
  1296.         ld      a,(hl)
  1297.         call    ch_put
  1298.  
  1299.  
  1300.         ; RegBë║ê╩4bit
  1301.         ld      hl,hex_tbl
  1302.         push    ix
  1303.         pop     bc
  1304.  
  1305.         ld      a,b
  1306.         and     a,$0F
  1307.  
  1308.         ld      b,0
  1309.         ld      c,a
  1310.         add     hl,bc
  1311.         ld      a,(hl)
  1312.         call    ch_put
  1313.  
  1314.         ; RegCÅπê╩4bit
  1315.         ld      hl,hex_tbl
  1316.         push    ix
  1317.         pop     bc
  1318.  
  1319.         ld      a,c
  1320.         rlca
  1321.         rlca
  1322.         rlca
  1323.         rlca
  1324.         and     a,$0F
  1325.  
  1326.         ld      b,0
  1327.         ld      c,a
  1328.         add     hl,bc
  1329.         ld      a,(hl)
  1330.         call    ch_put
  1331.  
  1332.         ; RegC ë║ê╩ 4bit
  1333.         ld      hl,hex_tbl
  1334.         push    ix
  1335.         pop     bc
  1336.  
  1337.         ld      a,c
  1338.         and     a,$0F
  1339.  
  1340.         ld      b,0
  1341.         ld      c,a
  1342.         add     hl,bc
  1343.         ld      a,(hl)
  1344.         call    ch_put
  1345.  
  1346.         ret
  1347.  
  1348. ;------------------------
  1349. vout_hex8
  1350. ;8bitò¥é╠16ÉiÉöò\ĪüB
  1351. ;A = ÉöÆl
  1352. ;dest = BC,HL,AF
  1353.         push    af ; é▒é╠âXâ^âbâNé═ë║ê╩4bité╠é╜é▀é╔ÄgéñüB
  1354.  
  1355.         ; RegA Åπê╩ 4bit
  1356.  
  1357.         ld      hl,hex_tbl
  1358.         rlca
  1359.         rlca
  1360.         rlca
  1361.         rlca
  1362.         and     a,$0F
  1363.  
  1364.         ld      b,0
  1365.         ld      c,a
  1366.         add     hl,bc
  1367.         ld      a,(hl)
  1368.         call    ch_put
  1369.  
  1370.         pop     af
  1371.  
  1372.         ; RegA ë║ê╩ 4bit
  1373.         ld      hl,hex_tbl
  1374.  
  1375.         and     a,$0F
  1376.  
  1377.         ld      b,0
  1378.         ld      c,a
  1379.         add     hl,bc
  1380.         ld      a,(hl)
  1381.         call    ch_put
  1382.  
  1383.         ret
  1384.  
  1385. ;------------------------------
  1386. vout_hyphen
  1387.         ld      a,'-'
  1388.         call    ch_put
  1389.         ret
  1390.  
  1391.  
  1392. ;------------------------
  1393. ; âEâFâCâgâïü[â`âô
  1394. ;Æìê╙üAé▒é╠âïü[â`âôî─é╤Åoé╡é╠ì█é═Åφé╔EIé┼éáéΘé▒é╞üB
  1395. ; B = âïü[âvë±Éö
  1396. wait_b
  1397.         halt
  1398.         djnz    wait_b
  1399.         ret
  1400.  
  1401. ;------------------------
  1402. ; âEâFâCâgâïü[â`âô
  1403. ;Æìê╙üAé▒é╠âïü[â`âôî─é╤Åoé╡é╠ì█é═Åφé╔EIé┼éáéΘé▒é╞üB
  1404. ; in .... B = âïü[âvë±Éö
  1405. ; out ... A = âLü[â}âgâèâNâXé╠éVö╘û┌üB
  1406. ; dest .. RegC
  1407. wait_key07
  1408.         ld      c,$ff
  1409. wk07_lp
  1410.         halt
  1411.         ld      a,($FBEB)
  1412.         and     a,c
  1413.         ld      c,a
  1414.         djnz    wk07_lp
  1415.         ld      a,c
  1416.         ret
  1417.  
  1418. ;------------------------
  1419. ;prn_text
  1420. ; HL = ò╢ÄÜù±
  1421.  
  1422. prn_text
  1423. prn_str_disp
  1424.         ld      a,(hl)
  1425.         or      a,a
  1426.         jp      z,nul_term
  1427.         call    ch_put
  1428.         inc     hl
  1429.         jr      prn_str_disp
  1430. nul_term
  1431.         ret
  1432.  
  1433. ;-------------------------
  1434. check_sum
  1435.         xor     a,a
  1436.         ld      bc,$4000
  1437.         ld      hl,$4000
  1438.         ld      de,$0000
  1439. csum_lp
  1440.         ld      a,(hl)
  1441.         add     a,e
  1442.         ld      e,a
  1443.         jr      nc,csum_nc
  1444.         inc     d
  1445. csum_nc
  1446.         inc     hl
  1447.         dec     bc
  1448.  
  1449.         ld      a,b
  1450.         or      a,c
  1451.         jr      nz,csum_lp
  1452.     ret
  1453.  
  1454. ;---------------------------------------------
  1455. check_rom
  1456.  
  1457.         ld      b,$80
  1458.  
  1459. chk_rom_loop
  1460.         ld      h,$40
  1461.         ld      a,b
  1462.         push    bc
  1463.         call    enaslt
  1464.         pop     bc
  1465.  
  1466.         ld      a,($4000)
  1467.         cp      a,'A'
  1468.         jr      nz,chk_p3
  1469.  
  1470.         ld      a,($4003)
  1471.         cp      a,$40
  1472.         jr      c,chk_p3  ; A-$40 < 0
  1473.         cp      a,$80
  1474.         jr      nc,chk_p3 ; A-$80 >= 0
  1475.         jp      chk_rom_ok 
  1476. ;
  1477. chk_p3
  1478.         ld      h,$80
  1479.         ld      a,b
  1480.         push    bc
  1481.         call    enaslt
  1482.         pop     bc
  1483.         
  1484.         ld      a,($8003)
  1485.         cp      a,$80
  1486.         jr      c,no_cart  ; A-$80 < 0
  1487.         cp      a,$C0
  1488.         jr      nc,no_cart ; A-$C0 >= 0
  1489.         jp      chk_rom_ok 
  1490. ;
  1491. no_cart
  1492.         inc     b
  1493.         ld      a,b
  1494.         and     a,$7f
  1495.         cp      a,$10
  1496.         jr      nz,chk_rom_loop 
  1497.  
  1498. chk_rom_ng
  1499.         ld      h,$40
  1500.         ld      a,$80
  1501.  
  1502.         push    bc
  1503.         call    enaslt
  1504.         pop     bc
  1505.  
  1506. chk_rom_ok
  1507.         ret
  1508.  
  1509. ;----------------------------------
  1510. p3_chk
  1511.         ld      a,($8000)
  1512.         cp      a,'A' 
  1513.         jp      z,page_set0
  1514.  
  1515.         ret
  1516.  
  1517. page_set0
  1518.         call    get_slotreg
  1519.         ld      c,a
  1520.         and     a,$3F         ; 00111111
  1521.         ld      b,a
  1522.         and     a,$03         ; 000000AA
  1523.         rrca
  1524.         rrca
  1525.         or      a,b           ; AABBBBAA
  1526.         out     (PSL_STAT),a
  1527.  
  1528.         ld      a,(SSL_REGS)
  1529.         cpl
  1530.         and     a,$F3         ; 11110011
  1531.         ld      d,a
  1532.         and     a,$03         ; 00000011
  1533.         rlca
  1534.         rlca
  1535.         or      a,d           
  1536.         ld      (SSL_REGS),a 
  1537.  
  1538.         ld      a,c
  1539.         and     a,$F3
  1540.         ld      c,a
  1541.         and     a,$03
  1542.         rlca
  1543.         rlca
  1544.         or      a,c
  1545.         out     (PSL_STAT),a
  1546.         ret
  1547.  
  1548.  
  1549. ;-------------------------------------
  1550. ;âJü[â\âïé≡RegDEé╔ò╧è╖é╖éΘüB
  1551. ;-------------------------------------
  1552. ;out.. DE = VRAMâAâhâîâX
  1553. curs2de
  1554.         push    af
  1555.         push    bc
  1556.         push    hl
  1557.  
  1558.     xor    a
  1559.     ld    hl,SCRMOD
  1560.     cp    (hl)
  1561.     jr    nz,c2d_scr1
  1562.         ld      hl,(TXTNAM)
  1563.         ld      de,40    ; text40 
  1564.     jr    c2d_do
  1565. c2d_scr1
  1566.     ld    hl,(T32NAM)
  1567.     ld    de,32    ; text32
  1568. ;    jr    c2d_do
  1569. c2d_do
  1570.  
  1571.         ld      a,(CSRY)
  1572.         cp      a,2
  1573.         jr      c,c2d_add_skip
  1574.         dec     a
  1575.         ld      b,a
  1576. c2d_add_lp
  1577.         add     hl,de
  1578.         djnz    c2d_add_lp
  1579. c2d_add_skip
  1580.         ld      a,(CSRX)
  1581.         cp      a,2
  1582.         jr      c,c2d_add_skip2
  1583.         dec     a
  1584.         ld      e,a
  1585.         add     hl,de
  1586.  
  1587. c2d_add_skip2
  1588.  
  1589.         ld      de,hl
  1590.  
  1591.         pop     hl
  1592.         pop     bc
  1593.         pop     af
  1594.         ret
  1595.  
  1596.  
  1597. ;-----------------------------------
  1598. ; RegDEé⌐éτâJü[â\âïê╩Æué╓ (CSRX,CSRY)
  1599. de2curs
  1600.         push    af
  1601.         push    bc
  1602.         push    de
  1603.         push    hl
  1604.  
  1605.         ex      de,hl
  1606.  
  1607.     xor    a
  1608.     ld    hl,SCRMOD
  1609.     cp    (hl)
  1610.     jr    nz,d2c_scr1
  1611.         ld      de,(TXTNAM)
  1612.         ld      bc,40
  1613.         jr      d2c_do
  1614. d2c_scr1
  1615.     ld    de,(T32NAM)
  1616.     ld    bc,32    ; text32
  1617. ;    jr    d2c_do
  1618. d2c_do
  1619.     inc    a
  1620.     ld    c,a
  1621.     jr    under_chk
  1622.  
  1623. d2c_sub_lp
  1624.         and     a
  1625.         sbc     hl,bc
  1626.         inc     e
  1627. under_chk
  1628.         xor     a,a
  1629.         cp      a,h
  1630.         jr      nz,d2c_sub_lp
  1631.         ld      a,l
  1632.         cp      a,40
  1633.         jr      nc,d2c_sub_lp
  1634.  
  1635.         ld      a,e
  1636.         inc     a
  1637.         ld      (CSRY),a
  1638.         ld      a,l
  1639.         inc     a
  1640.         ld      (CSRX),a
  1641.  
  1642.         pop     hl
  1643.         pop     de
  1644.         pop     bc
  1645.         pop     af
  1646.         ret
  1647.  
  1648.  
  1649.  
  1650. ;----------------------------------
  1651.  
  1652. m_rdprim
  1653.         out     (PSL_STAT),a
  1654.         ld      e,(hl)
  1655.         jr      m_wrprm1
  1656. m_wrprim
  1657.         out     (PSL_STAT),a
  1658.         ld      (hl),e
  1659. m_wrprm1
  1660.         ld      a,d
  1661.         out     (PSL_STAT),a
  1662.         ret
  1663. m_clprim
  1664.         out     (PSL_STAT),a
  1665.         ex      af,af'
  1666.         call    cl_jp
  1667.         ex      af,af'
  1668.         pop     af
  1669.         out     (PSL_STAT),a
  1670.         ex      af,af'
  1671.         ret
  1672. m_cl_jp
  1673.         jp      (ix)
  1674. m_prim_end
  1675.         nop
  1676.  
  1677. rdprim  equ     $F380
  1678. wrprim  equ     rdprim+(m_wrprim-m_rdprim)
  1679. clprim  equ     rdprim+(m_clprim-m_rdprim)
  1680. cl_jp   equ     rdprim+(m_cl_jp-m_rdprim)
  1681.  
  1682.  
  1683. ;---------------------------
  1684. ; âTâuâïü[â`âô
  1685. ;---------------------------
  1686. ; 000Ch RDSLT
  1687. ; in ..  A = âXâìâbâgID , HL = âAâhâîâX
  1688. rdslt
  1689.         push    hl
  1690.         push    af
  1691.  
  1692.         ld      a,h
  1693.         rlca
  1694.         rlca
  1695.         and     a,$03 ; âAâhâîâXÅπê╩2bit
  1696.  
  1697.         ld      l,a   ; L=âVâtâgâiâôâoü[
  1698.         ld      b,a
  1699.  
  1700.         ld      a,$03
  1701.         call    rdsft
  1702.         cpl
  1703.         ld      e,a ; E= â}âXâN
  1704.         ld      a,l ; A=âVâtâgâiâôâoü[
  1705.         ld      b,a ; B=âVâtâgâiâôâoü[
  1706.         pop     af
  1707.         and     a,$03
  1708.         call    rdsft
  1709.         ld      b,a ; B=âVâtâgé╡é╜âXâìâbâgö╘ìå
  1710.         in      a,(PSL_STAT)
  1711.         ld      d,a  ; D=æOé╠âvâëâCâ}âèâXâìâbâg
  1712.         and     a,e
  1713.         or      a,b  ; âXâìâbâgé≡ò╧ìXé╖éΘ
  1714.         pop     hl
  1715.  
  1716.         call    rdprim
  1717.         ld      a,e
  1718.         ret
  1719.  
  1720. rdsft
  1721.         inc     b
  1722.         dec     b
  1723.         ret     z
  1724. rdsft_lp
  1725.         rlca
  1726.         rlca
  1727.         djnz    rdsft_lp
  1728.         ret
  1729.  
  1730. ; 0014h WRSLT
  1731. ; in ..  A = âXâìâbâgID , HL = âAâhâîâX
  1732. wrslt
  1733.         push    hl
  1734.         push    af
  1735.  
  1736.         ld      a,h
  1737.         rlca
  1738.         rlca
  1739.         and     a,$03      ; âAâhâîâXÅπê╩ 2bit
  1740.  
  1741.         ld      l,a        ; L=âVâtâgö╘ìå
  1742.         ld      b,a
  1743.  
  1744.         ld      a,$03
  1745.         call    rdsft
  1746.         cpl
  1747.         ld      e,a        ; E=â}âXâN
  1748.         ld      a,l        ; A=âVâtâgâiâôâoü[
  1749.         ld      b,a        ; B=âVâtâgâiâôâoü[
  1750.         pop     af
  1751.         and     a,$03
  1752.         call    rdsft
  1753.         ld      b,a        ; B=âVâtâgé│éΩé╜âXâìâbâg
  1754.         in      a,(PSL_STAT)
  1755.         ld      d,a        ; D=æOé╠âvâëâCâ}âèâXâìâbâg
  1756.         and     a,e
  1757.         or      a,b        ; âXâìâbâgé≡ò╧ìXé╖éΘ
  1758.         pop     hl
  1759.  
  1760.         call    wrprim
  1761.         ret
  1762.  
  1763.  
  1764. ;-------------------------------------
  1765. ; 001Ch CALSLT(ÄbÆΦôIé╚è╓Éö)
  1766. ; in .. IYh(âXâìâbâgö╘ìå),(IX)
  1767. cal_slt
  1768.         jp      (ix)
  1769.  
  1770. ;--------------------------------
  1771. ; 0020h DCOMPRü@16ârâbâgöΣèr
  1772. ; in .. hl,de= ÉöÆl
  1773. wordcomp
  1774.         ld      a,h
  1775.         cp      a,d
  1776.         ret     nz
  1777.         ld      a,l
  1778.         cp      a,e
  1779.         ret
  1780.  
  1781.  
  1782. ;--------------------------------
  1783. ; 0024h ENASLT
  1784. ; in .. hl=âAâhâîâX,a=âXâìâbâgö╘ìå
  1785. ; A = FxxxEESS
  1786. ; RegA Å┌ì╫
  1787. ; F = ègÆúâXâìâbâgé╠âtâëâO
  1788. ; E = ègÆúâXâìâbâgö╘ìå
  1789. ; S = âXâìâbâgö╘ìå
  1790. ; Dest. AF,BC,DE,DI
  1791.  
  1792. enaslt
  1793.  
  1794. ; A=(A >> 6)&0x3
  1795.         di
  1796.     push    hl
  1797.  
  1798.     ld      l,a     ; L = FxxxEEPP
  1799.  
  1800.     and     a,$03   ; A = 000000PP
  1801.     ld      b,a
  1802.     ld      a,$AB
  1803. psl_dup_lp
  1804.     add    a,$55
  1805.     dec    b
  1806.         jp      p,psl_dup_lp
  1807.  
  1808.     ld      d,a     ; D = PP PP PP PP
  1809.  
  1810.     ld      a,h
  1811.     rlca
  1812.     rlca
  1813.     and    a,$03
  1814.  
  1815.     ld      h,a    ; H = âAâhâîâXÅπê╩ 2bit
  1816.  
  1817.     ld      b,a
  1818.  
  1819.     ld    a,$C0
  1820. page_msk_lp
  1821.     rlca
  1822.     rlca
  1823.     dec    b
  1824.         jp      p,page_msk_lp
  1825.  
  1826.     ld    e,a    ; E = 00 00 11 00(âyü[âWâ}âXâN)
  1827.     cpl
  1828.     ld    c,a    ; C = 11 11 00 11(AND MASK)
  1829.  
  1830.     ld    a,d
  1831.     and    a,e
  1832.     ld    b,a     ; B = 00 00 PP 00
  1833.  
  1834.     ld    a,l
  1835.     and    a,a
  1836.     jp    p,chg_psl
  1837.  
  1838. ;SSL-Change
  1839.     rrca
  1840.     rrca
  1841.     and    a,$03   ; A = 000000SS
  1842.  
  1843.     push    hl
  1844.     push    bc
  1845.  
  1846.     ld    b,a
  1847.     ld      a,$AB
  1848. ssl_dup_lp
  1849.     add    a,$55
  1850.     dec    b
  1851.         jp      p,ssl_dup_lp
  1852.  
  1853.     and    a,e
  1854.     ld    b,a    ; B = 00 00 SS 00
  1855.  
  1856.     ld    a,d
  1857.     and    a,$C0
  1858.     ld      h,a
  1859.  
  1860.     in    a,(PSL_STAT)
  1861.     ld    l,a
  1862.     and    a,$C0
  1863.     or    a,h
  1864.     out    (PSL_STAT),a
  1865.  
  1866.     ld    a,(SSL_REGS)
  1867.     cpl
  1868.     and    a,c
  1869.     or    a,b    ; A = xx xx SS xx ( x = æOé╠Æl )
  1870.     ld    c,a
  1871.     ld    (SSL_REGS),a
  1872.  
  1873.     ld    a,l
  1874.     out    (PSL_STAT),a
  1875.  
  1876.     ; (SLTTBL + PP) <- RegC
  1877.  
  1878.     ld    hl,SLT_TBL
  1879.  
  1880.         ld      a,d
  1881.         and     a,$03    ; A = 000000PP
  1882.  
  1883.         add     a,l
  1884.         ld      l,a    ; L = L + A
  1885.  
  1886.         ld      a,h
  1887.         adc     a,0
  1888.         ld      h,a    ; H = H + Cy
  1889.  
  1890.     ld    a,c
  1891.     ld    (hl),a
  1892.  
  1893.     pop    bc
  1894.     pop    hl
  1895.  
  1896. chg_psl
  1897.     in      a,(PSL_STAT)
  1898.         and     a,c
  1899.         or      a,b
  1900.         out     (PSL_STAT),a
  1901.  
  1902.     pop    hl
  1903.         ret
  1904.  
  1905.  
  1906. ;--------------------------------
  1907. ; 0030h CALLLF
  1908. call_lf
  1909.         pop     hl ; âXâìâbâgÅεò±é╠âAâhâîâX
  1910.         ld      a,(hl)
  1911.         inc     hl
  1912.         ld      e,(hl)
  1913.         inc     hl
  1914.         ld      d,(hl)
  1915.         inc     hl
  1916.         ex      de,hl
  1917.         push    de
  1918.         push    hl
  1919.         push    af
  1920.         call    enaslt
  1921.         pop     af
  1922.         pop     hl
  1923.         jp      (hl)
  1924.  
  1925.  
  1926. ;--------------------------------
  1927. ; 0050h SETRD
  1928. vdp_setrd
  1929.  
  1930.         di
  1931.         ld      a,l
  1932.         out     (VDP_ADDR),a
  1933.         ld      a,h
  1934.         and     a,$3f
  1935.         out     (VDP_ADDR),a
  1936.         ei
  1937.         ret
  1938.  
  1939. ;--------------------------------
  1940. ; 0053h SETWRT
  1941. ; VRAMâAâhâîâXé╠É▌ÆΦ
  1942. vdp_setwrt
  1943.  
  1944.         di
  1945.         ld      a,l
  1946.         out     (VDP_ADDR),a
  1947.         ld      a,h
  1948.         and     a,$3f
  1949.         or      a,$40
  1950.         out     (VDP_ADDR),a
  1951.         ei
  1952.         ret
  1953.  
  1954. ;--------------------------------
  1955. ;0056h fill VRAM
  1956. ;HL = VRAM âAâhâîâX, BC = Æ╖é│ , A = âfü[â^
  1957. vdp_fillmem
  1958.         push    af
  1959.         call    vdp_setwrt
  1960. lp_u001
  1961.         pop     af
  1962.         out     (VDP_DATA),a
  1963.         push    af
  1964.  
  1965.         dec     bc
  1966.         ld      a,c
  1967.         or      b
  1968.         jr      nz,lp_u001
  1969.         pop     af
  1970.         ret
  1971.  
  1972. ;--------------------------------
  1973. wrt_vdp 
  1974. ; 0047h WRTVDP
  1975. ;in:B = VDP âfü[â^ , C = âîâWâXâ^ö╘ìå
  1976. ; dest af,b 
  1977.         push    hl
  1978.         di
  1979.         ld      a,b
  1980.         out     (VDP_ADDR),a
  1981.         ld      a,c
  1982.         or      a,$80
  1983.         out     (VDP_ADDR),a
  1984.         ei
  1985.         ld      a,c
  1986.         and     a,$3F
  1987.         sub     a,8
  1988.         jr      nc,rg8_sav
  1989.         ld      a,b
  1990.         ld      b,0
  1991.         ld      hl,RG0SAV
  1992.         add     hl,bc
  1993.         ld      (hl),a
  1994.         pop     hl
  1995.         ret
  1996.  
  1997. rg8_sav
  1998.         push    bc
  1999.         ld      c,a
  2000.  
  2001.         ld      a,b
  2002.         ld      b,0
  2003.         ld      hl,RG8SAV
  2004.         add     hl,bc
  2005.         ld      (hl),a
  2006.         pop     bc
  2007.         pop     hl
  2008.         ret
  2009.  
  2010.  
  2011.  
  2012.  
  2013. ;--------------------------------
  2014. ;004Ah VRAMô╟é▌Åoé╡
  2015. rd_vrm
  2016.         call    vdp_setrd
  2017.         ex      (sp),ix
  2018.         ex      (sp),ix
  2019.         in      a,(VDP_DATA)
  2020.         ret
  2021.  
  2022.  
  2023. ;--------------------------------
  2024. ;004Dh VRAMÅæé½ì₧é▌
  2025. wrt_vrm
  2026.         push    af
  2027.         call    vdp_setwrt
  2028.         ex      (sp),ix
  2029.         ex      (sp),ix
  2030.         pop     af
  2031.         out     (VDP_DATA),a
  2032.         ret
  2033.  
  2034. ;--------------------------------
  2035. ;in de bc 
  2036. ;dest. af de bc 
  2037. vdp_ldirmv
  2038.     call    vdp_setrd
  2039.     ex    (sp),ix
  2040.     ex    (sp),ix
  2041. ldir_lp1
  2042.     in    a,(VDP_DATA)
  2043.     ld    (de),a
  2044.     inc    de
  2045.     dec    bc
  2046.     ld    a,c
  2047.     or    b
  2048.     jr    nz,ldir_lp1
  2049.     ret
  2050.  
  2051. ;--------------------------------
  2052. vdp_reg1chk
  2053.         ld      a,(RG1SAV)
  2054.         rrca
  2055.         rrca
  2056.         ld      a,$08
  2057.         ret     nc
  2058.         ld      a,$20
  2059.         ret
  2060.  
  2061. ;--------------------------------
  2062. ;in hl de bc 
  2063. ;dest. af de bc 
  2064. vdp_data_rep
  2065.         ex      de,hl
  2066.         call    vdp_setwrt
  2067. lp_vd_rep
  2068.         ld      a,(de)
  2069.         out     (VDP_DATA),a
  2070.         inc     de
  2071.         dec     bc
  2072.         ld      a,c
  2073.         or      b
  2074.         jr      nz,lp_vd_rep
  2075.         ret
  2076. ;------------------------------
  2077. ;screen 5é╠Åëè·ë╗.
  2078. init_sc5
  2079.         ld      a,$05
  2080.         ld      (SCRMOD),a
  2081.  
  2082.         in      a,(VDP_STAT)    ; âëâbâ`âèâZâbâg
  2083.  
  2084.         call    chgclr
  2085.  
  2086.         ld      a,(RG0SAV)
  2087.         and     a,$F1        ; MASK 11110001
  2088.         or      a,$06           ; M4,M3 = 1
  2089.  
  2090.         ld      b,a             ; B = R#0 data
  2091.         ld      c,0
  2092.  
  2093.         call    wrt_vdp        ; VDP R#0
  2094.  
  2095.  
  2096.         ld      a,(RG0SAV+1)
  2097.         and     a,$E7           ; MASK 11100111
  2098.  
  2099.         ld      b,a             ; B = R#1 data
  2100.         inc     c
  2101.  
  2102.         call    wrt_vdp         ; VDP R#1
  2103.  
  2104.         ld      hl,$0000
  2105.         ld      (NAMBAS),hl
  2106.         ld      (CGPBAS),hl
  2107.         ld      hl,$7600
  2108.         ld      (ATRBAS),hl
  2109.         ld      hl,$7800
  2110.         ld      (PATBAS),hl
  2111.  
  2112.         ld      b,$1F           ; B = data
  2113.         ld      c,2
  2114.         call    wrt_vdp         ; VDP R#2
  2115.  
  2116.         ld      a,(RG0SAV+3)
  2117.         ld      b,a             ; B = data
  2118.         ld      c,3
  2119.         call    wrt_vdp         ; VDP R#3
  2120.  
  2121.         ld      a,(RG0SAV+4)
  2122.         ld      b,a             ; B = data
  2123.         ld      c,4
  2124.         call    wrt_vdp         ; VDP R#4
  2125.  
  2126.         ld      b,$ef           ; B = data
  2127.         ld      c,5
  2128.         call    wrt_vdp         ; VDP R#5
  2129.  
  2130.         ld      b,$0f           ; B = data
  2131.         inc     c
  2132.         call    wrt_vdp         ; VDP R#6
  2133.  
  2134.  
  2135.  
  2136.         ld      b,$08           ; B = data
  2137.         ld      c,8
  2138.         call    wrt_vdp         ; VDP R#8
  2139.  
  2140.         ld      b,$80           ; B = data
  2141.         ld      c,9
  2142.         call    wrt_vdp         ; VDP R#9
  2143.  
  2144.  
  2145.         ld      b,0             ; B = data
  2146.         ld      c,10
  2147.         call    wrt_vdp         ; VDP R#10
  2148.         ld      b,0             ; B = data
  2149.         inc     c
  2150.         call    wrt_vdp         ; VDP R#11
  2151.         ld      b,0             ; B = data
  2152.         inc     c
  2153.         call    wrt_vdp         ; VDP R#12
  2154.         ld      b,0             ; B = data
  2155.         inc     c
  2156.         call    wrt_vdp         ; VDP R#13
  2157.         ld      b,1             ; B = data
  2158.         inc     c
  2159.         call    wrt_vdp         ; VDP R#14
  2160.         ld      b,0             ; B = data
  2161.         inc     c
  2162.         call    wrt_vdp         ; VDP R#15
  2163.         ld      b,$0F           ; B = data
  2164.         inc     c
  2165.         call    wrt_vdp         ; VDP R#16
  2166.         ld      b,$2C           ; B = data
  2167.         inc     c
  2168.         call    wrt_vdp         ; VDP R#17
  2169.         ld      b,$00           ; B = data
  2170.         inc     c
  2171.         call    wrt_vdp         ; VDP R#18
  2172.         ld      b,$00           ; B = data
  2173.         inc     c
  2174.         call    wrt_vdp         ; VDP R#19
  2175.         ld      b,$00           ; B = data
  2176.         inc     c
  2177.         call    wrt_vdp         ; VDP R#20
  2178.  
  2179.         ld      b,$3B           ; B = data
  2180.         inc     c
  2181.         call    wrt_vdp         ; VDP R#21
  2182.         ld      b,$05           ; B = data
  2183.         inc     c
  2184.         call    wrt_vdp         ; VDP R#22
  2185.  
  2186.  
  2187.         call    enascr
  2188.         ret
  2189.  
  2190. ;------------------------------
  2191. ;VDPé≡âXâNâèü[âô7é┼Åëè·ë╗é╖éΘüB
  2192. init_sc7
  2193.         ld      a,$07
  2194.         ld      (SCRMOD),a
  2195.  
  2196.         in      a,(VDP_STAT)    ; âëâbâ`é╠âèâZâbâg
  2197.  
  2198.         call    chgclr
  2199.  
  2200.         ld      a,(RG0SAV)
  2201.         and     a,$F1        ; MASK 11110001
  2202.         or      a,$0A           ; M4,M3 = 1
  2203.  
  2204.         ld      b,a             ; B = R#0 data
  2205.         ld      c,0
  2206.  
  2207.         call    wrt_vdp        ; VDP R#0
  2208.  
  2209.  
  2210.         ld      a,(RG0SAV+1)
  2211.         and     a,$E7           ; MASK 11100111
  2212.  
  2213.         ld      b,a             ; B = R#1 data
  2214.         inc     c
  2215.  
  2216.         call    wrt_vdp         ; VDP R#1
  2217.  
  2218.         ld      hl,$0000
  2219.         ld      (NAMBAS),hl
  2220.         ld      (CGPBAS),hl
  2221.         ld      hl,$7600
  2222.         ld      (ATRBAS),hl
  2223.         ld      hl,$7800
  2224.         ld      (PATBAS),hl
  2225.  
  2226.         ld      b,$1F           ; B = data
  2227.         ld      c,2
  2228.         call    wrt_vdp         ; write VDP R#2
  2229.  
  2230.         ld      a,(RG0SAV+4)
  2231.         ld      b,a             ; B = data
  2232.         ld      c,4
  2233.         call    wrt_vdp         ; write VDP R#4
  2234.  
  2235.         ld      a,(RG0SAV+3)
  2236.         ld      b,a             ; B = data
  2237.         ld      c,3
  2238.         call    wrt_vdp         ; write VDP R#3
  2239.  
  2240.  
  2241.         ld      b,0             ; B = data
  2242.         ld      c,10
  2243.         call    wrt_vdp         ; write VDP R#10
  2244.         ld      b,0             ; B = data
  2245.         inc     c
  2246.         call    wrt_vdp         ; write VDP R#11
  2247.         ld      b,0             ; B = data
  2248.         inc     c
  2249.         call    wrt_vdp         ; write VDP R#12
  2250.  
  2251.  
  2252.         ld      b,$00           ; B = data
  2253.         ld      c,19
  2254.         call    wrt_vdp         ; write VDP R#19
  2255.  
  2256.         ld      b,$01           ; B = data
  2257.         ld      c,15
  2258.         call    wrt_vdp         ; write VDP R#15
  2259.  
  2260.         in      a,(VDP_STAT)    ; reset Latch
  2261.  
  2262.  
  2263.         ld      b,$00           ; B = data
  2264.         ld      c,15
  2265.         call    wrt_vdp         ; write VDP R#15
  2266.  
  2267.  
  2268.  
  2269.  
  2270.         ld      b,$ef           ; B = data
  2271.         ld      c,5
  2272.         call    wrt_vdp         ; write VDP R#5
  2273.         ld      b,$0f           ; B = data
  2274.         inc     c
  2275.         call    wrt_vdp         ; write VDP R#6
  2276.  
  2277.         call    enascr
  2278.         ret
  2279.  
  2280.  
  2281. ;--------------------------------
  2282. ;0072h INIGRP
  2283. init_grp
  2284.         ld      a,$02
  2285.         ld      (SCRMOD),a
  2286.  
  2287.         in      a,(VDP_STAT)    ; reset Latch
  2288.  
  2289.         call    chgclr
  2290.  
  2291.         ld      a,(RG0SAV)
  2292.         and     a,$F1        ; MASK 11110001
  2293.         or      a,2             ; M3 = 1
  2294.  
  2295.         ld      b,a             ; B = R#0 data
  2296.         ld      c,0
  2297.  
  2298.         call    wrt_vdp        ; write VDP R#0
  2299.  
  2300.  
  2301.         ld      a,(RG1SAV)
  2302.         and     a,$E7           ; MASK 11100111
  2303.  
  2304.         ld      b,a             ; B = R#1 data
  2305.         inc     c
  2306.  
  2307.         call    wrt_vdp        ; write VDP R#1
  2308.  
  2309.         ld      hl,(GRPNAM)
  2310.         call    vdp_setwrt
  2311.         ld      b,3
  2312.         xor     a,a
  2313. ig_loop
  2314.         out     (VDP_DATA),a
  2315.         inc     a
  2316.         jr      nz,ig_loop
  2317.         djnz    ig_loop
  2318.  
  2319.         ld      hl,(GRPATR)
  2320.         ld      (ATRBAS),hl
  2321.  
  2322.         ld      hl,(GRPPAT)
  2323.         ld      (PATBAS),hl
  2324.  
  2325.         ld      hl,GRPNAM
  2326.         ld      de,$7F03
  2327.         call    set_grp
  2328.         call    enascr
  2329.         ret
  2330.  
  2331. ; HL = âeü[âuâïâAâhâîâX
  2332. ; B  = DATA , C = VDP R#
  2333. ; DE = VDPDATA
  2334. set_grp
  2335.         push    ix
  2336.         ld      ix,shift_tbl
  2337.         ld      c,2       ; C = VDP R#
  2338.  
  2339.         xor     a,a       ; data=0
  2340.         call    adr_sft   ; R#2
  2341.         ld      a,d       ; data=D
  2342.         call    adr_sft   ; R#3
  2343.         ld      a,e       ; data=E
  2344.         call    adr_sft   ; R#4
  2345.         xor     a,a       ; data=0
  2346.         call    adr_sft   ; R#5
  2347.         xor     a,a       ; data=0
  2348.         call    adr_sft
  2349.         pop     ix
  2350.         ret
  2351.  
  2352. shift_tbl
  2353.         db      $06,$0A,$05,$09,$05
  2354.  
  2355. ;
  2356. ;HL = âeü[âuâïâAâhâîâX
  2357. ;
  2358. adr_sft
  2359.         push    hl
  2360.         push    af
  2361.         ld      b,(ix)
  2362.         inc     ix
  2363.  
  2364.     ; HL <- (HL)
  2365.         ld      a,(hl)
  2366.         inc     hl
  2367.         ld      h,(hl)
  2368.         ld      l,a
  2369. sft_lp
  2370.         add     hl,hl
  2371.         adc     a,a
  2372.         djnz    sft_lp
  2373.         ld      h,a    ; H = âVâtâgé╡é╜HLé╠Åπê╩üB
  2374.         pop     af
  2375.  
  2376.         or      a,h
  2377.         ld      b,a
  2378.  
  2379.         call    wrt_vdp
  2380.         pop     hl
  2381.         inc     hl
  2382.         inc     hl
  2383.         inc     c
  2384.         ret
  2385.  
  2386. ;----------------------------------
  2387. ;005Fh CHGMOD   ëµû╩âéü[âhé╠ò╧ìX
  2388. chgmod
  2389.         or      a,a
  2390.         jp      z,init_txt   ; screen 0
  2391.         dec     a
  2392.         jp      z,init_txt32 ; screen 1
  2393.         dec     a
  2394.         jp      z,init_grp   ; screen 2
  2395.         dec     a
  2396. ;
  2397. ;        jp     z,init_mlt   ; screen 3
  2398. ;
  2399.         dec     a
  2400. ;
  2401. ;        jp     z,init_sc4   ; screen 4
  2402. ;
  2403.         dec     a
  2404.         jp      z,init_sc5   ; screen 5
  2405.         dec     a
  2406. ;        jp      z,init_sc6  ; screen 6
  2407.         dec     a
  2408.         jp      z,init_sc7   ; screen 7
  2409.  
  2410.         ret
  2411.  
  2412. ;--------------------------------
  2413. ;006Ch INITXT
  2414. init_txt
  2415.         ld      a,$00
  2416.         ld      (SCRMOD),a
  2417.  
  2418.         call    clr_text40
  2419.  
  2420.         in      a,(VDP_STAT)    ; reset Latch
  2421.         call    chgclr
  2422.  
  2423.         ld      a,(RG0SAV)
  2424.         and     a,$F1        ; MASK 11110001
  2425.  
  2426.         ld      b,a             ; B = R#0 data
  2427.         ld      c,0
  2428.  
  2429.         call    wrt_vdp        ; write VDP R#0
  2430.  
  2431.  
  2432.         ld      a,(RG1SAV)
  2433.         and     a,$E7           ; MASK 11100111
  2434.         or      a,$10
  2435.  
  2436.         ld      b,a             ; B = R#1 data
  2437.         inc     c
  2438.  
  2439.         call    wrt_vdp        ; write VDP R#1
  2440.  
  2441.     ld    bc,$0104    ; R#4 PatGenTBLaddr=$0800
  2442.     call    wrt_vdp        ; write VDP R#4
  2443.  
  2444.     ld    bc,$0002    ; R#2 PatNamTBLaddr=$0000
  2445.     call    wrt_vdp        ; write VDP R#2
  2446.  
  2447.         in      a,(VDP_STAT)    ; reset Latch
  2448.  
  2449.         ld      hl,B_Font
  2450.         ld      de,(TXTCGP)
  2451.         ld      bc,$800
  2452.         call    vdp_data_rep    ; init Font
  2453.  
  2454.         ld     hl,$0000
  2455.         ld     (NAMBAS),hl
  2456.         ld     hl,$0800
  2457.         ld     (CGPBAS),hl
  2458.  
  2459.     ld    a,39
  2460.     ld    (LINLEN),a
  2461.  
  2462.         ret
  2463.  
  2464. ;--------------------------------
  2465. ;006Fh INIT32
  2466. init_txt32
  2467.         ; screen 1
  2468.         ld      a,$01
  2469.         ld      (SCRMOD),a
  2470.  
  2471.         call    clr_text32
  2472.  
  2473.         call    chgclr
  2474.  
  2475.         ld      a,(RG0SAV)
  2476.         and     a,$F1        ; MASK 11110001
  2477.  
  2478.         ld      b,a             ; B = R#0 data
  2479.         ld      c,0
  2480.  
  2481.         call    wrt_vdp        ; write VDP R#0
  2482.  
  2483.  
  2484.         ld      a,(RG1SAV)
  2485.         and     a,$E7           ; MASK 11100111
  2486.  
  2487.         ld      b,a             ; B = R#1 data
  2488.         inc     c
  2489.  
  2490.         call    wrt_vdp        ; write VDP R#1
  2491.  
  2492.         ld     hl,(T32NAM)
  2493.         ld     (NAMBAS),hl
  2494.         ld     hl,(T32CGP)
  2495.         ld     (CGPBAS),hl
  2496.         ld     hl,(T32PAT)
  2497.         ld     (PATBAS),hl
  2498.         ld     hl,(T32ATR)
  2499.         ld     (ATRBAS),hl
  2500.  
  2501.         ld      hl,(T32NAM)
  2502.         ld      a,h
  2503.         rrca
  2504.         rrca
  2505.         and     a,$3F
  2506.  
  2507.         ld      b,a
  2508.         ld      c,2
  2509.         call    wrt_vdp         ; write VDP R#2
  2510.  
  2511.  
  2512.         ld     hl,(T32COL)
  2513.         ld     b,2
  2514. tcol_lp
  2515.         xor    a,a
  2516.         rl     l
  2517.         rl     h
  2518.         djnz   tcol_lp
  2519.         ld     a,h
  2520.  
  2521.         ld     b,a
  2522.         ld     c,3
  2523.         call    wrt_vdp         ; write VDP R#3
  2524.  
  2525.         ld      hl,(T32CGP)
  2526.         ld      a,h
  2527.         rrca
  2528.         rrca
  2529.         rrca
  2530.         and     a,$1F
  2531.  
  2532.         ld      b,a
  2533.         ld      c,4
  2534.         call    wrt_vdp         ; write VDP R#4
  2535.  
  2536.         ld      hl,(T32ATR)
  2537.         rl     l
  2538.         rl     h
  2539.         ld     a,h
  2540.  
  2541.         ld     b,a
  2542.         ld     c,5
  2543.         call   wrt_vdp         ; write VDP R#5
  2544.         
  2545.         ld      hl,(T32PAT)
  2546.         ld    a,h
  2547.         rrca
  2548.         rrca
  2549.         rrca
  2550.         and     a,$1F
  2551.         ld     b,a
  2552.         ld     c,6
  2553.         call   wrt_vdp         ; write VDP R#6
  2554.  
  2555.         in      a,(VDP_STAT)    ; reset Latch
  2556.  
  2557.         ld      hl,B_Font
  2558.         ld      de,(T32CGP)
  2559.         ld      bc,$800
  2560.         call    vdp_data_rep    ; init Font
  2561.  
  2562.  
  2563. ;        ld      a,1
  2564. ;        ld      (CSRY),a
  2565. ;        ld      (CSRX),a
  2566.  
  2567.     ld    a,29
  2568.     ld    (LINLEN),a
  2569.  
  2570.         ret
  2571.  
  2572. ;0062h CHGCLR
  2573. ;in = û│é╡
  2574. chgclr
  2575.         ld      a,(SCRMOD)
  2576.         dec     a
  2577.         push    af
  2578.         ld      a,(FORCLR)
  2579.         rlca
  2580.         rlca
  2581.         rlca
  2582.         rlca
  2583.         ld      l,a
  2584.         ld      a,(BDRCLR)
  2585.         or      a,l
  2586.  
  2587.         ld      b,a
  2588.         ld      c,7
  2589.         call    wrt_vdp
  2590.         pop     af
  2591.         ret     nz
  2592.  
  2593.         ld      a,(FORCLR)
  2594.         rlca
  2595.         rlca
  2596.         rlca
  2597.         rlca
  2598.         and     a,$F0
  2599.         ld      hl,BAKCLR
  2600.         or      a,(hl)
  2601.         ld      hl,(T32COL)
  2602.         ld      bc,$0020
  2603.         push    af
  2604.         call    vdp_setwrt
  2605. cclr_lp pop     af
  2606.         out     (VDP_DATA),a
  2607.         push    af
  2608.         dec     bc
  2609.         ld      a,b
  2610.         or      c
  2611.         jr      nz,cclr_lp
  2612.         pop     af
  2613.         ret
  2614.  
  2615. ;0044h ENASCR
  2616. enascr
  2617.         in      a,(VDP_STAT) ; reset Latch
  2618.  
  2619.         ld      a,(RG1SAV)
  2620.         or      a,$40
  2621.         ld      b,a
  2622.         ld      c,1
  2623.         call    wrt_vdp
  2624.         ret
  2625.  
  2626. ;00?? DISSCR
  2627. disscr
  2628.         in      a,(VDP_STAT) ; reset Latch
  2629.  
  2630.         ld      a,(RG1SAV)
  2631.         and     a,$BF
  2632.         ld      b,a
  2633.         ld      c,1
  2634.         call    wrt_vdp
  2635.         ret
  2636.  
  2637.  
  2638. ;--------------------------------
  2639. ;009Ch  CHSNS
  2640. ch_sns
  2641.         push    hl
  2642.         push    de
  2643.         ld      hl,(GETPNT)
  2644.         ld      de,(PUTPNT)
  2645.         call    wordcomp
  2646.         jr      z,no_chr
  2647.         ld      a,(hl)
  2648.         and     a,a
  2649.         pop     de
  2650.         pop     hl
  2651.         ret
  2652. no_chr
  2653.         xor     a,a
  2654.         and     a,a
  2655.         pop     de
  2656.         pop     hl
  2657.         ret
  2658.  
  2659. ;---------------------------------
  2660. ;009Fh  CHGET
  2661. ch_get
  2662.         ld      a,$00
  2663.         push    hl
  2664.         push    de
  2665.         push    bc
  2666. loop_chget
  2667.         ld      hl,(GETPNT)
  2668.         ld      de,(PUTPNT)
  2669.         call    wordcomp
  2670.         jr      nz,get_ch
  2671.         ei
  2672.         halt
  2673.         jr      loop_chget
  2674. get_ch
  2675.         ld      hl,(PUTPNT)
  2676.         ld      bc,(GETPNT)
  2677.         ld      a,(bc)
  2678.         and     a,a
  2679.         push    af
  2680.         ld      bc,39
  2681.         ld      hl,(GETPNT)
  2682.         inc     hl
  2683.         ld      de,(GETPNT)
  2684.         ldir
  2685.         ld      de,(PUTPNT)
  2686.         dec     de
  2687.         ld      (PUTPNT),de
  2688.         pop     af
  2689.         pop     bc
  2690.         pop     de
  2691.         pop     hl
  2692.         ret
  2693. ;-----------------------------------
  2694. ;00A2h  CHPUT
  2695. ;in ... A = âLâââëâNâ^âRü[âh
  2696. ch_put
  2697.         push    de
  2698.         push    af
  2699.         ld      a,(SCRMOD)
  2700.         ld      e,a
  2701.         ld      a,1
  2702.         cp      a,e
  2703.         jr      nc,scr_txt_mode
  2704.         pop     af
  2705.         pop     de
  2706.     ret
  2707.  
  2708. scr_txt_mode
  2709.         pop     af
  2710.         push    af
  2711.  
  2712.     ; CTRL code
  2713.         cp      a,$08
  2714.         jp      z,back_spc
  2715.         cp      a,$0d
  2716.         jp      z,ctrl_cr
  2717.         cp      a,$0a
  2718.         jp      z,ctrl_lf
  2719.  
  2720.     ; Charactor code
  2721.  
  2722.         call    set_curs
  2723.         pop     af
  2724.         push    af
  2725.         out     (VDP_DATA),a
  2726.         ld      a,(LINLEN)
  2727.         ld      e,a
  2728.         ld      a,(CSRX)
  2729.         cp      a,e
  2730.         jr      nc,chput_nx
  2731.  
  2732.     ; next point
  2733.         inc     a
  2734. chput_ret
  2735.         ld      (CSRX),a
  2736.         pop     af
  2737.         pop     de
  2738.     ret
  2739. chput_nx
  2740.     ld    a,(CRTCNT)
  2741.     ld    e,a
  2742.     ld    a,(CSRY)
  2743.     cp    a,e
  2744.     jr    nc,chput_scrll
  2745.         ld      a,(CSRY)
  2746.         inc     a
  2747.         ld      (CSRY),a
  2748.         ld      a,1
  2749.     jr    chput_ret
  2750. chput_scrll
  2751.     call    scroll_txt
  2752.     ld    a,1
  2753.     jr    chput_ret
  2754.  
  2755. set_curs
  2756.         call    curs2de
  2757.         ex      de,hl
  2758.         call    vdp_setwrt
  2759.         ex      de,hl
  2760.     ret
  2761.  
  2762. back_spc
  2763.         ld      a,(CSRX)
  2764.         cp      a,2
  2765.         jr      c,skip_bs
  2766.         dec     a
  2767.         ld      (CSRX),a
  2768.         call    set_curs
  2769.         xor     a,a
  2770.         out     (VDP_DATA),a
  2771. skip_bs
  2772.         pop     af
  2773.         pop     de
  2774.     ret
  2775. ; 0Dh CR
  2776. ctrl_cr
  2777.         ld      a,1
  2778.         ld      (CSRX),a
  2779.         pop     af
  2780.         pop     de
  2781.     ret
  2782.  
  2783. ; 0Ah LF  âëâCâôâtâBü[âh
  2784. ctrl_lf
  2785.         ld      a,(CRTCNT)
  2786.         ld      e,a
  2787.         ld      a,(CSRY)
  2788.         cp      a,e
  2789.         jr      nc,lf_scroll
  2790.         inc     a
  2791.         ld      (CSRY),a
  2792.         pop     af
  2793.         pop     de
  2794.     ret
  2795. lf_scroll
  2796.     call    scroll_txt
  2797.     pop    af
  2798.     pop    de
  2799.     ret
  2800.  
  2801. ; âXâNâìü[âïâïü[â`âô
  2802. scroll_txt
  2803.     push    af
  2804.         push    bc
  2805.         push    hl
  2806.         push    de
  2807.         ld      hl,(NAMBAS)
  2808.         ld      de,LINWRK
  2809.         ld      a,(CRTCNT)
  2810. ;        ld      (CSRY),a
  2811. ;        dec     a
  2812.         ld      b,a
  2813.     ld    a,(SCRMOD)
  2814.     and    a
  2815.     jr    nz,scroll_n0
  2816.     ld    c,40
  2817.     jr    scr_loop
  2818. scroll_n0
  2819.     dec    a
  2820.     jr    nz,scroll_n1
  2821.     ld    c,32
  2822.  
  2823. scr_loop
  2824.     push    bc
  2825.     xor    a
  2826.     ld    b,a
  2827.  
  2828.         add     hl,bc
  2829.         push    hl
  2830.         push    de
  2831.     push    bc
  2832.         call    vdp_ldirmv  ; HL=VRAM,DE=RAM,BC=LENGTH
  2833.     pop    bc
  2834.         pop     de
  2835.         pop     hl
  2836.  
  2837.     sbc    hl,bc
  2838.  
  2839.         ex      de,hl      ; DE = VRAM,HL = RAM
  2840.  
  2841.         push    hl
  2842.         push    de
  2843.     push    bc
  2844.         call    vdp_data_rep
  2845.     pop    bc
  2846.         pop     de
  2847.         pop     hl
  2848.  
  2849.         ex      de,hl      ; DE = RAM,HL = VRAM
  2850.  
  2851.         add     hl,bc
  2852.  
  2853.     pop    bc
  2854.         djnz    scr_loop
  2855.  
  2856.         ld      a,0
  2857.         call    vdp_fillmem
  2858.  
  2859.  
  2860. scroll_n1
  2861.         pop     de
  2862.         pop     hl
  2863.         pop     bc
  2864.         pop     af
  2865.     ret
  2866.  
  2867.  
  2868.  
  2869. ;-----------------------
  2870. ;00C6h    âJü[â\âïé≡É▌ÆΦé╖éΘ
  2871. ;in ... RegH = X, RegL = Y
  2872. curxy
  2873.         ld      a,h
  2874.         ld      (CSRY),a
  2875.         ld      a,l
  2876.         ld      (CSRX),a
  2877.         ret
  2878.  
  2879. ;-----------------------
  2880.  
  2881.  
  2882.  
  2883. ;--------------------------------------
  2884. ;0156h  KILBUF    âLü[âoâbâtâ@é≡âNâèâAüB
  2885. kilbuf
  2886.         push    de
  2887.         push    bc
  2888.         push    af
  2889.         ld      hl,KEYBUF
  2890.         ld      (PUTPNT),hl
  2891.  
  2892.         ld      a,$FF
  2893.         ld      hl,OLDKEY
  2894.         ld      (hl),a
  2895.         ld      de,OLDKEY+1
  2896.         ld      bc,21
  2897.         ldir
  2898.         pop     af
  2899.         pop     bc
  2900.         pop     de
  2901.         ret
  2902.  
  2903.  
  2904. ;--------------------------------
  2905. ;0090h GICINIT    ë╣î╣ICÅëè·ë╗
  2906. sound_init
  2907.         ld      e,$00
  2908.         ld      a,$08
  2909.         call    sound_out
  2910.         inc     a
  2911.         call    sound_out
  2912.         inc     a   
  2913.         call    sound_out
  2914.         inc     a
  2915.  
  2916.         ld      e,$b8
  2917.         ld      a,$07
  2918.         call    sound_out
  2919.         ret
  2920.  
  2921. ;--------------------------------
  2922. ;0093h in a=reg#,e=data
  2923. sound_out
  2924.         di
  2925.         out     (PSG_REGS),a
  2926.         push    af
  2927.         ld      a,e
  2928.         out     (PSG_DATA),a
  2929.         ei
  2930.         pop     af
  2931.  
  2932. ;âTâEâôâhâéü[âhùp
  2933. ;        push  af
  2934. ;        push  de
  2935. ;        ld    d,a
  2936. ;        ld    a,(PSG_DBG)
  2937. ;        or    a,a
  2938. ;        call  nz,disp_psg
  2939. ;        pop   de
  2940. ;        pop   af
  2941.  
  2942.         ret
  2943.  
  2944. ;--------------------------------
  2945. sound_stat
  2946.         out     (PSG_REGS),a
  2947.         in      a,(PSG_STAT)
  2948.         ret
  2949.  
  2950. ;--------------------------------
  2951. get_slotreg
  2952.         in      a,(PSL_STAT)
  2953.         ret
  2954.  
  2955. ;--------------------------------
  2956. set_slotreg
  2957.         out     (PSL_STAT),a
  2958.         ret
  2959.  
  2960. ;--------------------------------
  2961. ; 013Eh 
  2962. vdp_stat_in
  2963.         in      a,(VDP_STAT)
  2964.         ret
  2965.  
  2966. ;--------------------------------
  2967. ;0141h SNSMAT
  2968. ; in a = âLü[â{ü[âhâ}âgâèâNâXìsÉö
  2969. ;dest AF,C,EI
  2970.  
  2971. in_keyboard
  2972.         di
  2973.         ld      c,a
  2974.         in      a,(GIO_REGS)
  2975.         and     a,$F0
  2976.         or      a,c
  2977.         out     (GIO_REGS),a
  2978.         in      a,(KBD_STAT)
  2979.         ei
  2980.         ret
  2981.  
  2982. ;--------------------------------
  2983. ;00D5h GTSTCK
  2984. ; a = InID...
  2985. ; dest AF,BC,EI
  2986. in_joy
  2987.  
  2988.         push    bc
  2989.         cp      a,$00
  2990.         jr      nz,joy_stc1
  2991.  
  2992.         ld      a,$08
  2993.         call    in_keyboard
  2994.         rrca
  2995.         rrca
  2996.         rrca
  2997.         rrca
  2998.         cpl
  2999.         and     a,$0f ; 0000RDUL
  3000.        
  3001.         push    hl
  3002.         ld      hl,joypos_kbd_tbl
  3003.         ld      b,0
  3004.         ld      c,a
  3005.         add     hl,bc
  3006.         ld      a,(hl)
  3007.         pop     hl
  3008.         pop     bc
  3009.         and     a,a
  3010.         ret
  3011. joy_stc1
  3012. ;PSG reg 15h
  3013. ;0J001111
  3014. ;PSG reg 14h
  3015. ;00BARLDU
  3016.         push    hl
  3017.         push    de
  3018.  
  3019.         ld      e,0
  3020.         dec     a
  3021.         jr      z,sel_stc1
  3022.         ld      a,$40
  3023.         ld      e,a
  3024. sel_stc1
  3025.         ld      a,$0F
  3026.         di
  3027.         call    sound_stat
  3028.         ei
  3029.         and     a,$BF
  3030.         or      a,e
  3031.         ld      e,a
  3032.         ld      a,$0F
  3033.         call    sound_out
  3034.         ld      a,$0e
  3035.         di
  3036.         call    sound_stat
  3037.         ei
  3038.         cpl
  3039.         and     a,$0f ; 0000RLDU
  3040.         
  3041.  
  3042.         ld      hl,joypos_joy_tbl
  3043.         ld      b,0
  3044.         ld      c,a
  3045.         add     hl,bc
  3046.         ld      a,(hl)
  3047.         pop     de
  3048.         pop     hl
  3049.  
  3050.         pop     bc
  3051.         and     a,a
  3052.         ret
  3053.  
  3054. joy_end
  3055.         ld      a,$00
  3056.         pop     bc
  3057.         and     a,a
  3058.         ret
  3059.  
  3060. joypos_joy_tbl
  3061.         ;    0   1   2   3   4   5   6   7
  3062.         db $00,$01,$05,$00,$07,$08,$06,$00
  3063.         ;    8   9   A   B   C   D   E   F
  3064.         db $03,$02,$04,$00,$00,$00,$00,$00
  3065.  
  3066. joypos_kbd_tbl
  3067.         ;    0   1   2   3   4   5   6   7
  3068.         db $00,$07,$01,$08,$05,$06,$00,$00
  3069.         ;    8   9   A   B   C   D   E   F
  3070.         db $03,$00,$02,$00,$04,$00,$00,$00
  3071.  
  3072.  
  3073. ;--------------------------------
  3074. ;00D8h GTTRIG
  3075. ;dest AF,BC,EI
  3076. ;
  3077.  
  3078. in_trig
  3079.         cp      a,$00
  3080.         jr      z,kbd_spc
  3081.         jr      joy_trig
  3082. kbd_spc
  3083.         ld      a,$08
  3084.         call    in_keyboard
  3085.         and     a,$01
  3086.         jr      z,spc_on
  3087.         jr      spc_off
  3088. spc_on
  3089.         ld      a,$FF
  3090.         ret
  3091. spc_off
  3092.         xor     a,a
  3093.         ret
  3094.  
  3095. joy_trig
  3096.         di
  3097.         dec     a
  3098.         push    de
  3099.         ld      e,$00
  3100.         ld      b,a
  3101.         and     a,$01
  3102.         jr      z,sel_trig1
  3103.         ld      e,$40
  3104. sel_trig1
  3105.         ld      a,$0F
  3106.         call    sound_stat
  3107.         and     a,$BF
  3108.         or      a,e
  3109.         ld      e,a
  3110.         ld      a,$0F
  3111.         call    sound_out
  3112.  
  3113.         ld      a,b
  3114.         ld      b,$10
  3115.         and     a,$02
  3116.         jr      z,istrg_a
  3117.         ld      b,$20
  3118. istrg_a
  3119.         ld      a,$0e
  3120.         di
  3121.         call    sound_stat
  3122.         ei
  3123.         pop     de
  3124.         and     a,b
  3125.         jr      z,trig_on
  3126.         jr      trig_off
  3127. trig_on
  3128.         ld      a,$FF
  3129.         ret
  3130. trig_off
  3131.         xor     a,a
  3132.         ret
  3133.  
  3134.  
  3135.  
  3136.  
  3137. ;------------------
  3138. ; interrupt routine code
  3139. ;------------------
  3140.  
  3141. int_start
  3142. ;âfâoâbâOùp
  3143. ;        push    hl
  3144. ;        ld  hl,$3232
  3145. ;        ex (sp),hl
  3146.         push    hl
  3147.         push    de
  3148.         push    bc
  3149.         push    af
  3150.         exx  
  3151.         ex      af,af'
  3152.         push    hl
  3153.         push    de
  3154.         push    bc
  3155.         push    af
  3156.         push    iy
  3157.         push    ix
  3158.  
  3159.         call    H_KEYI
  3160.         in      a,(VDP_STAT)
  3161.         or      a,a
  3162.         jp      p,int_end
  3163.  
  3164.         call    H_TIMI
  3165.  
  3166.         ld      hl,(JIFFY)
  3167.         inc     hl
  3168.         ld      (JIFFY),hl
  3169.  
  3170.         
  3171.         ei
  3172.         ld      (STATFL),a ; âXâeü[â^âXò█æ╢
  3173.  
  3174.         xor     a,a
  3175.         ld      (CLIKFL),a
  3176.         call    in_trig
  3177.         cpl
  3178.         and     a,$01
  3179.         ld      ($F3E8),a
  3180.         call    old_key
  3181.         call    key_in
  3182.  
  3183. int_end
  3184.         pop     ix
  3185.         pop     iy
  3186.         pop     af
  3187.         pop     bc
  3188.         pop     de
  3189.         pop     hl
  3190.         exx
  3191.         ex      af,af'
  3192.         pop     af
  3193.         pop     bc
  3194.         pop     de
  3195.         pop     hl
  3196.         ei
  3197.         ret
  3198.  
  3199. ;--------------------------------
  3200. ; 0066h NMIèäéΦì₧é▌
  3201. nmi_int
  3202.         call    H_NMI
  3203.         retn
  3204.  
  3205. ;--------------------------------
  3206. old_key
  3207.         ld      de,NEWKEY
  3208.         ld      hl,OLDKEY
  3209.         ld      b,$0b
  3210. oldkey_lp
  3211.         ld      a,(de)
  3212.         ld      (hl),a
  3213.         inc     de
  3214.         inc     hl
  3215.         djnz    oldkey_lp
  3216.         ret
  3217.  
  3218. ;--------------------------------
  3219. ; âLü[â{ü[âhôⁿù═é≡âoâbâtâ@é╔ĵéΦì₧é▐
  3220. key_in
  3221.         in      a,(GIO_REGS)
  3222.         and     a,$F0
  3223.         ld      c,a
  3224.         ld      b,$0b
  3225.         ld      hl,NEWKEY
  3226. key_in_lp
  3227.         ld      a,c
  3228.         out     (GIO_REGS),a
  3229.         in      a,(KBD_STAT)
  3230.         ld      (hl),a
  3231.         inc     hl
  3232.         inc     c
  3233.         djnz    key_in_lp
  3234.         call    key_chk
  3235.         ret
  3236.  
  3237. ;--------------------------------
  3238. ; âLü[âRü[âhâ`âFâbâNâïü[â`âô
  3239. ; èäéΦì₧é▌é⌐éτî─é╤Åoé│éΩéΘüB
  3240. ;
  3241. key_chk
  3242.         ld      ix,OLDKEY
  3243.         ld      de,NEWKEY
  3244.         ld      a,($FBEB)
  3245.         rrca
  3246.         jr      nc,code_shift
  3247.         ld      hl,scode_tbl
  3248.         jr      scan_start
  3249. code_shift
  3250.         ld      hl,scode_tbl_shift
  3251. scan_start
  3252.         ld      b,$0b
  3253. key_chk_lp
  3254.         ld      a,(de)
  3255.         cpl
  3256.         and     a,(ix)
  3257.         ld      c,$08
  3258. key_bit_lp
  3259.         rrca
  3260.         jr      c,push_pnt
  3261.         inc     hl
  3262.         dec     c
  3263.         jr      nz,key_bit_lp
  3264.         inc     ix
  3265.         inc     de
  3266.         djnz    key_chk_lp
  3267.         ret
  3268. push_pnt
  3269.         push    hl
  3270.         push    de
  3271.         push    bc
  3272.         ld      a,(hl)
  3273.         and     a,a
  3274.  
  3275.         ; RegAé¬ò\Īë┬ö\âLâââëâNâ^é┼é╚é»éΩé╬âXâgâbâNé╡é╚éóüB
  3276.  
  3277.         jr      z,pnt_flow
  3278.         ld      c,a
  3279.         ld      de,LIMPNT
  3280.         ld      hl,(PUTPNT)
  3281.         call    wordcomp
  3282.         jr      nc,pnt_flow
  3283.         ld      a,c
  3284.         ld      (hl),a
  3285.         inc     hl
  3286.         ld      (PUTPNT),hl
  3287. pnt_flow
  3288.         pop     bc
  3289.         pop     de
  3290.         pop     hl
  3291.         ret
  3292.  
  3293. key_int
  3294.         ld      hl,NEWKEY
  3295.         ld      bc,$0006
  3296.         add     hl,bc
  3297.         ld      a,(hl)
  3298.         and     a,$01
  3299.         jr      nz,ki_end
  3300.         call    dbg_reg
  3301. ki_end
  3302.         ret
  3303.  
  3304. ;-------------------
  3305.         org     $1000
  3306.  
  3307.         ld      a,$82
  3308.         out     (PPI_REGS),a
  3309.  
  3310.         ld      a,$C9
  3311.         ld      (H_KEYI),a
  3312.         ld      (H_TIMI),a
  3313.  
  3314.         ei
  3315.  
  3316. hang_up_mode
  3317.         ld      a,$06
  3318.         call    in_keyboard
  3319.         bit     0,a
  3320.         jp      z,debug_mode
  3321.  
  3322.         halt
  3323.  
  3324.         jp      hang_up_mode
  3325.  
  3326.         org     $1020
  3327. stack_error
  3328.         call    H_STKE
  3329.         ld      de,str_stack_error
  3330.         jp      print_error
  3331.  
  3332. ;------------------------------------
  3333. ;âxü[âVâbâNî─é╤Åoé╡
  3334. call_basic_intr
  3335.         ld      de,str_no_basic_intr
  3336.         jp      print_error
  3337.  
  3338. ;------------------------------------
  3339. ;âGâëü[ò\Ī
  3340. ;in DE=âüâbâZü[âWé╠âAâhâîâXüB
  3341.  
  3342. print_error
  3343.         in      a,(VDP_STAT) ; reset Latch 
  3344.         ld      hl,vdp_bios
  3345.         ld      b,$0C
  3346.         ld      c,VDP_ADDR
  3347.     otir
  3348.  
  3349.         ld      bc,$0800
  3350. lp_clearmem
  3351.         xor     a,a
  3352.         out     (VDP_DATA),a
  3353.         dec     bc
  3354.         ld      a,b
  3355.         or      a,c
  3356.         jr      nz,lp_clearmem
  3357.  
  3358.         ld      hl,B_Font
  3359.         ld      bc,$800
  3360. lp_fontset
  3361.         ld      a,(hl)
  3362.         out     (VDP_DATA),a
  3363.         inc     hl
  3364.         dec     bc
  3365.         ld      a,b
  3366.         or      a,c
  3367.         jr      nz,lp_fontset
  3368.  
  3369. ;set cursor to (0,0)
  3370.         ld      a,$00
  3371.         out     (VDP_ADDR),a
  3372.         ld      a,$40
  3373.         out     (VDP_ADDR),a
  3374.  
  3375.         ld      hl,str_error_prompt
  3376.  
  3377.         ld      a,(hl)
  3378. lp_errprn
  3379.         out     (VDP_DATA),a
  3380.         inc     hl
  3381.         ld      a,(hl)
  3382.         and     a,a
  3383.         jr      nz,lp_errprn
  3384.  
  3385.         ld      a,(de)
  3386. lp_strprn
  3387.         out     (VDP_DATA),a
  3388.         inc     de
  3389.         ld      a,(de)
  3390.         and     a,a
  3391.         jr      nz,lp_strprn
  3392.  
  3393.         jp      hang_up_mode
  3394.  
  3395.  
  3396. ;------------------------------------
  3397. ;âfâBâXâNâïü[â`âô
  3398. ;------------------------------------
  3399.  
  3400. DISKIO  equ     $4010
  3401.  
  3402. disk_intr
  3403.         ld      hl,str_flist
  3404.         call    prn_text
  3405.  
  3406.         xor     a,a
  3407.         ld      bc,$01F9
  3408.         ld      de,$0000
  3409.         ld      hl,$C000
  3410.         and     a,a
  3411.  
  3412.         call    DISKIO
  3413.         jp      c,disk_error
  3414.         ld      hl,($C00B)
  3415.  
  3416.         ; âZâNâ^ü[âTâCâY / 0x20(âtâ@âCâïì\æóæ╠)
  3417.  
  3418.         ld      b,5        
  3419. shift_adr
  3420.         and     a,a
  3421.         rr      h
  3422.         rr      l
  3423.         djnz    shift_adr        
  3424.  
  3425.         ld      ($E100),hl
  3426.  
  3427.         ld      a,($C010)
  3428.         ld      b,a
  3429.         ld      hl,$0001
  3430.         ld      de,($C016)
  3431. dsk_lp
  3432.         add     hl,de
  3433.         djnz    dsk_lp
  3434.  
  3435.         ex      de,hl
  3436.         xor     a,a
  3437.         ld      bc,$01F9
  3438.         ld      hl,$C000
  3439.         and     a,a
  3440.         call    DISKIO
  3441.         jp      c,disk_error
  3442.  
  3443.         ld      ix,$C000
  3444.  
  3445.         ld      a,($E100)
  3446.         ld      c,a
  3447.  
  3448. file_lp
  3449.         ld      a,(ix)
  3450.         and     a,a
  3451.         jp      z,end_lp
  3452.         ld      b,8
  3453. name_lp
  3454.         ld      a,(ix)
  3455.         inc     ix
  3456.         call    ch_put
  3457.         djnz    name_lp
  3458.  
  3459.         ld      a,'.'
  3460.         call    ch_put
  3461.  
  3462.         ld      b,3
  3463. ext_lp
  3464.         ld      a,(ix)
  3465.         inc     ix
  3466.         call    ch_put
  3467.         djnz    ext_lp
  3468.  
  3469.         ld      de,$0015
  3470.         add     ix,de
  3471.  
  3472.         ld      hl,str_crlf
  3473.         call    prn_text
  3474.  
  3475.         dec     c
  3476.         jr      nz,file_lp
  3477.  
  3478. end_lp
  3479.         
  3480.         jp      hang_up_mode
  3481.  
  3482. ;        ld      de,str_disk
  3483. ;        jp      print_error
  3484.  
  3485. disk_error
  3486.         push    af
  3487.         ld      hl,str_diskerr
  3488.         call    prn_text
  3489.         pop     af
  3490.         ld      b,0
  3491.         ld      c,a
  3492.         ld      hl,str_de_addr
  3493.         add     hl,bc
  3494.  
  3495.         ld      e,(hl)
  3496.         inc     hl
  3497.         ld      d,(hl)
  3498.  
  3499.         ex      de,hl
  3500.         call    prn_text
  3501.  
  3502.         jp      hang_up_mode
  3503.         
  3504.  
  3505.  
  3506. ;---------------------------------
  3507. ;âVâXâeâÇâüâbâZü[âW
  3508. ;---------------------------------
  3509.  
  3510. str_proginfo
  3511. ;                0123456789012345678901234567890123456789 
  3512.         db      "C-BIOS ver 0.17",$0d,$0a
  3513.         db      "Copyright (C) 2002-2003 BouKiCHi",$0d,$0a
  3514.         db      "Copyright (C) 2003 Reikan",$0d,$0a
  3515.         db      $00
  3516.  
  3517. str_slot
  3518.         db      $0d,$0a,"Slot:",$00
  3519. str_chksum
  3520.         db      $0d,$0a,"CheckSum:",$00
  3521. str_isgame
  3522.         db      " Game:",$00
  3523.  
  3524. ;-------------------------------------
  3525. ;âGâëü[âüâbâZü[âW
  3526. str_error_prompt
  3527. ;
  3528.         db      "ERROR:",$00
  3529. str_memory_err
  3530. ;
  3531.         db      "MEMORY NOT FOUND.",$00
  3532.  
  3533. str_no_basic_intr
  3534. ;
  3535.         db      "CALLED NO EXISTANCE BASIC.",$00
  3536.  
  3537. str_disk
  3538. ;
  3539.         db      "CALLED DISK ROUTINE.",$00
  3540.  
  3541. str_stack_error
  3542. ;
  3543.         db      "STACK ERROR.",$00
  3544.  
  3545. str_crlf
  3546.         db      $0d,$0a,$00
  3547.  
  3548. str_flist
  3549.         db      $0d,$0a,"--- display disk file list ---",$0d,$0a,$00
  3550.  
  3551. str_diskerr
  3552.         db      "Disk Error:",$00
  3553.  
  3554. str_de_addr
  3555.         dw str_de_wp
  3556.         dw str_de_nr
  3557.         dw str_de_de
  3558.         dw str_de_se
  3559.         dw str_de_rn
  3560.         dw str_de_wf
  3561.         dw str_de_oe
  3562.  
  3563. str_de_wp
  3564.         db      "Write protected",$0d,$0a,$00
  3565. str_de_nr
  3566.         db      "Not ready",$0d,$0a,$00
  3567. str_de_de
  3568.         db      "Data (CRC) error",$0d,$0a,$00
  3569. str_de_se
  3570.         db      "Seek error",$0d,$0a,$00
  3571. str_de_rn
  3572.         db      "Record not found",$0d,$0a,$00
  3573. str_de_wf
  3574.         db      "Write fault",$0d,$0a,$00
  3575. str_de_oe
  3576.         db      "Other Error",$0d,$0a,$00
  3577.  
  3578. str_nocart
  3579. ;                0123456789012345678901234567890123456789 
  3580.         db      $0d,$0a
  3581.         db      "        Cartridge not found.",$00
  3582.  
  3583. str_run
  3584. ;               [0123456789012345678901234567890123456789] 
  3585.         db      $0d,$0a,$0d,$0a
  3586.         db      "           Starting...",$00
  3587.  
  3588. str_s_test
  3589. ;               [0123456789012345678901234567890123456789] 
  3590.         db      $0d,$0a,$0d,$0a
  3591.         db      "           SOUND TEST MODE",$00
  3592.  
  3593.  
  3594. hex_tbl
  3595.         db      "0123456789ABCDEF",$00
  3596. reg_tbl
  3597.         db      "PC: IY: IX: HL: DE: BC: AF: ",$00
  3598.  
  3599. ;âXâLâââôâRü[âhâeü[âuâï
  3600. scode_tbl
  3601.         db      "01234567"       ;00
  3602.         db      "89-^\@[;"       ;01
  3603.         db      ":],./_ab"       ;02
  3604.         db      "cdefghij"       ;03
  3605.         db      "klmnopqr"       ;04
  3606.         db      "stuvwxyz"       ;05
  3607.         db      $00,$00,$00,$00,$00,$00,$00,$00 ;06
  3608.         db      $00,$00,$1B,$09,$00,$08,$00,$0D ;07
  3609.         db      $20,$00,$00,$00,$1D,$1E,$1F,$1C ;08
  3610.         db      $00,$00,$00,$00,$00,$00,$00,$00 ;09
  3611.         db      $00,$00,$00,$00,$00,$00,$00,$00 ;0a
  3612.  
  3613. scode_tbl_shift
  3614.         db      "0!",$22,"#$%&'" ;00
  3615.         db      "()=~|`{+"       ;01
  3616.         db      "*}<>?_AB"       ;02
  3617.         db      "CDEFGHIJ"       ;03
  3618.         db      "KLMNOPQR"       ;04
  3619.         db      "STUVWXYZ"       ;05
  3620.         db      $00,$00,$00,$00,$00,$00,$00,$00 ;06
  3621.         db      $00,$00,$1B,$09,$00,$08,$00,$0D ;07
  3622.         db      $20,$00,$00,$00,$1D,$1E,$1F,$1C ;08
  3623.         db      $00,$00,$00,$00,$00,$00,$00,$00 ;09
  3624.         db      $00,$00,$00,$00,$00,$00,$00,$00 ;0a
  3625.  
  3626. vdp_bios
  3627.         db      $00,$80,$70,$81,$00,$82,$01,$84
  3628.         db      $f5,$87,$00,$40
  3629.  
  3630.  
  3631. ;    include "cb_snd.a80"
  3632.  
  3633. ;------------
  3634. ;âfâoâbâOùpâtâbâNâïü[â`âôüB
  3635.  
  3636.        org     $3232
  3637. debug_test
  3638.         ret
  3639.  
  3640.     include "b_font.z80"
  3641.  
  3642. ;       include "font_fh.z80"
  3643. ;       include "font_sh.z80"
  3644.  
  3645.         align
  3646.         org     $3FFF
  3647.         nop
  3648.         end     Start
  3649.